Imiona dla dzieci w Pythonie – ćwiczenie

Administracja Opieki Społecznej dysponuje tymi uporządkowanymi danymi według roku, w których imiona dzieci urodzone w tym roku w Stanach Zjednoczonych są najpopularniejsze (patrz imion dla dzieci ubezpieczenia społecznego).

Pliki do tego ćwiczenia znajdują się w katalogu "babynames" w google-python-exercises (pobierz plik google-python-exercises.zip, jeśli jeszcze go nie masz; szczegółowe informacje znajdziesz w sekcji Konfiguracja). Dodaj swój kod w pliku Babynames.py. Pliki dziecko1990.html dziecko1992.html ... zawierają nieprzetworzony kod HTML, podobny do plików na powyższej stronie dotyczącej ubezpieczenia społecznego. Spójrz na kod HTML i zastanów się, jak możesz usunąć z niego dane.

Część A

W pliku Baidunames.py zaimplementuj funkcję expand_names(filename) , która pobiera nazwę pliku Baby*.html i zwraca dane z tego pliku w postaci pojedynczej listy – ciągu roku na początku listy, po którym następuje ciąg znaków w kolejności alfabetycznej. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Zmodyfikuj funkcję main(), aby wywołała funkcję extract_names() i wyświetla zwracaną wartość (główny ma już kod do analizy argumentów w wierszu poleceń). Jeśli nie możesz opracować wyrażeń regularnych na potrzeby roku i każdej nazwy, wzorce rozwiązań znajdziesz na końcu tego dokumentu. Wyrażenia regularne nie sprawdzają się w przypadku analizy stron internetowych, ale mają prosty i spójny format.

Zamiast traktować osobno imiona i nazwiska chłopców i dziewcząt, połączymy je wszystkie razem. W niektórych latach nazwa pojawia się w kodzie HTML więcej niż raz, ale w jednej nazwie jest używany tylko jeden numer. Opcjonalnie: zastosuj algorytm inteligentny w danym przypadku i wybierz mniejszą liczbę.

Program powinien składać się z krótkich kroków milowych, na których należy wykonać kolejny krok lub wykonać wydrukowany etap. To wzorzec używany przez doświadczonych programistów – utwórz serię kolejnych etapów, z których każda będzie mieć jeszcze jakieś dane wyjściowe do sprawdzenia, zamiast tworzyć cały program za pomocą jednego ogromnego kroku.

Wydrukowanie danych na koniec jednego kamienia milowego ułatwia zastanowienie się, jak zmienić ich strukturę na potrzeby kolejnego kamienia milowego. W języku Python dobrze sprawdza się ten styl rozwoju przyrostowego. Na przykład najpierw przenieś go do punktu, w którym wyodrębniony zostanie i drukuje rok oraz wywołany jest sys.exit(0). Oto kilka sugerowanych etapów:

  • Wyodrębnij cały tekst z pliku i wydrukuj go
  • Znajdź i wyodrębnij rok, a następnie go wydrukuj
  • Wyodrębnij imiona i nazwiska, uszereguj numery i wydrukuj je
  • Zapisz dane z imionami i wydrukuj je w dyktacie
  • Utwórz listę [year, 'name rank', ... ] i wydrukuj ją.
  • Popraw metodę main(), aby używać listy ExtractNames

Wcześniej użyliśmy funkcji do drukowania w standardzie. Funkcja *zwraca* wyodrębnione dane jest bardziej przydatna, więc osoba wywołująca może je wydrukować lub wykonać w inny sposób. (W trakcie opracowywania niewielkich eksperymentów możesz drukować bezpośrednio z poziomu funkcji).

Polecenie main() powoduje wywołanie funkcji extract_names() dla każdego argumentu wiersza poleceń oraz wydrukowanie podsumowania tekstowego. Aby uzyskać z listy rozsądny tekst podsumowania, możesz skorzystać z funkcji złączania: text = '\n'.join(mylist) + '\n'

Tekst podsumowania dla każdego pliku powinien wyglądać tak:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...

Część B

Załóżmy, że zamiast drukować tekst na standardowy, chcemy zapisać pliki zawierające tekst. Jeśli znajduje się flaga --summaryfile, wykonaj te czynności: dla każdego pliku wejściowego „foo.html” zamiast drukować na standardowy plik wpisz nowy plik „foo.html.summary” zawierający tekst podsumowania tego pliku.

Gdy funkcja --summaryfile zacznie działać, uruchom program dla wszystkich plików, wpisując * w następujący sposób: „./babynames.py --summaryfile dziecko*.html”. W ten sposób wszystkie podsumowania zostaną wygenerowane w jednym kroku. Standardowym działaniem powłoki jest rozwinięcie wzorca „baby*.html” na listę pasujących nazw plików, a następnie powłoka uruchamia stronę Babynames.py, która przekazuje wszystkie te nazwy plików na liście sys.argv.

Gdy dane są uporządkowane w plikach podsumowania, możesz zobaczyć wzorce w czasie za pomocą poleceń powłoki, takich jak:

$ grep 'Trinity ' *.summary
$ grep 'Nick ' *.summary
$ grep 'Miguel ' *.summary
$ grep 'Emily ' *.summary

Wskazówki dotyczące wyrażeń regularnych – rok: r'Popularność\sin\s(\d\d\d\d)' name: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'