Administracja ubezpieczenia społecznego dysponuje kompleksowymi danymi według roku najpopularniejszych imion dzieci urodzonych w danym roku w USA (zobacz imiona dla dzieci).
Pliki do tego ćwiczenia znajdują się w „babynames” w katalogu google-python-exercises (pobierz plik google-python-exercises.zip, jeśli jeszcze go nie masz, w sekcji Konfiguracja dowiesz się więcej). Dodaj swój kod w childnames.py. Pliki baby1990.html baby1992.html ... zawierają nieprzetworzony kod html, podobny do tego, jakie można uzyskać po przejściu do powyższej witryny ubezpieczenia społecznego. Spójrz na kod HTML i zastanów się, jak możesz z niego wydobyć dane.
Część A
W pliku babynames.py zaimplementuj funkcję load_names(filename), która pobiera nazwę pliku baby*.html i zwraca dane z niego w jednej liście – w postaci ciągu roku na początku listy, po którym następuje kolejne ciągi znaków w kolejności alfabetycznej. [„2006”, „Aaliyah 91”, „Abagail 895”, „Aaron 57”, ...]. Zmodyfikuj funkcję main() tak, aby wywoływała funkcję load_names() i drukowała wynik (główna funkcja ma już kod analizy argumentu wiersza poleceń). Jeśli utkniesz w opracowaniu wyrażeń regularnych na ten rok i każdą nazwę, na końcu tego dokumentu znajdziesz wzorce wyrażeń regularnych rozwiązań. Wyrażenia regularne nie sprawdzają się zwykle w przypadku analizy stron internetowych, ale mają one prosty i spójny format.
Zamiast nazwać je dla chłopca i dziewczynki osobno, po prostu je polubimy. W niektórych latach imię i nazwisko pojawia się w kodzie HTML więcej niż raz, ale w każdej z nich będzie używana tylko jedna cyfra. Opcjonalnie: zastosuj algorytm rozsądny w tym przypadku i wybierz mniejszą liczbę.
Opracuj program jako serię drobnych kamieni milowych, aby najpierw coś poprowadzić lub wydrukować, a dopiero potem przejść do kolejnego. To schemat, z którego korzystają doświadczeni programiści. Zamiast tworzyć cały program w jednym wielkim kroku, należy stworzyć serię kolejnych etapów, każdy z danymi wyjściowymi do sprawdzenia.
Wydrukowanie danych na koniec jednego etapu pomaga zastanowić się, jak zmienić ich strukturę pod kątem kolejnego etapu. Python świetnie nadaje się do tego stylu przyrostowego programowania. Na przykład najpierw dotrzyj do punktu, w którym wyodrębnił i wyświetlił rok oraz wywołał funkcję sys.exit(0). Oto kilka sugerowanych etapów:
- Wyodrębnij z pliku cały tekst i go wydrukuj
- Znajdź i wyodrębnij rok oraz wydrukuj go
- Wyodrębnij imiona i nazwiska oraz pozycje liczbowe, a następnie je wydrukuj
- Zapisz dane z imionami i nazwiska w słowniku i je wydrukuj
- Przygotuj i wydrukuj listę [year, 'name rank', ... ]
- Napraw funkcję main(), aby używać listy ExtractNames
Wcześniej wprowadziliśmy funkcje drukowania w celu ujednolicenia. Bardziej nadaje się do ponownego użycia, gdy funkcja *zwraca* wyodrębnione dane, więc dzwoniący może je wydrukować lub zrobić z nimi coś innego. (wciąż będzie można drukować bezpośrednio z poziomu funkcji w trakcie programowania).
Użyj funkcji main() w celu wywołania wyodrębniania_names() dla każdego argumentu wiersza poleceń i wydrukuj podsumowanie tekstowe. Aby sporządzić przystępny tekst podsumowania, warto użyć zastosowania łączenia: text = '\n'.join(mylist) + '\n'
Podsumowanie tekstu w przypadku każdego pliku powinno wyglądać tak:
2006 Aaliyah 91 Aaron 57 Abagail 895 Abbey 695 Abbie 650 ...
Część B
Załóżmy, że zamiast drukowania tekstu w standardowym formacie chcemy zapisać pliki zawierające ten tekst. Jeśli obecna jest flaga --summaryfile, wykonaj te czynności: dla każdego pliku wejściowego „foo.html” zamiast drukowania standardowego pliku wyjściowego, zapisz nowy plik „foo.html.summary” zawierający tekst podsumowania danego pliku.
Gdy funkcja --summaryfile zacznie działać, uruchom program na wszystkich plikach przy użyciu znaku * w następujący sposób: „./babynames.py --summaryfile baby*.html”. Spowoduje to wygenerowanie wszystkich podsumowań w jednym kroku. Standardowym zachowaniem powłoki jest rozwinięcie wzorca „baby*.html” na listę pasujących nazw plików, po czym powłoka uruchamia plik babynames.py, wstawiając wszystkie te nazwy z listy sys.argv.
Gdy dane są uporządkowane w plikach podsumowania, możesz za pomocą poleceń powłoki przeglądać wzorce w czasie, na przykład:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
Wskazówki dotyczące wyrażeń regularnych -- rok: r'Popularity\sin\s(\d\d\d\d)' nazwy: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'