Python-Übung für Babynamen

Die US-amerikanische Sozialversicherungsbehörde verfügt über diese detaillierten Daten zu den beliebtesten Namen für in diesem Jahr in den USA geborene Babys (siehe Sozialversicherungsbabynamen).

Die Dateien für diese Übung befinden sich in google-python-exercises im Verzeichnis „babynames“. Laden Sie die Datei google-python-exercises.zip herunter, falls Sie das noch nicht getan haben. Weitere Informationen finden Sie unter Einrichten. Fügen Sie Ihren Code in babynames.py hinzu. Die Dateien baby1990.html baby1992.html ... enthalten unformatierten HTML-Code, ähnlich dem, was Sie auf der oben genannten Website der Sozialversicherung finden. Schauen Sie sich den HTML-Code an und überlegen Sie, wie Sie die Daten daraus extrahieren könnten.

Teil A

Implementieren Sie in der Datei babynames.py die Funktionextract_names(filename), die den Dateinamen einer baby*.html-Datei verwendet und die Daten aus der Datei als einzelne Liste zurückgibt: die Jahreszeichenfolge am Anfang der Liste gefolgt von den Namensrang-Strings in alphabetischer Reihenfolge. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Ändern Sie main() so, dass sie Ihre Funktionextract_names() aufruft und das Ergebnis ausgibt (main enthält bereits den Code für das Parsen von Befehlszeilenargumenten). Wenn Sie beim Ausarbeiten der regulären Ausdrücke für das Jahr und die einzelnen Namen nicht weiterkommen, werden am Ende dieses Dokuments die Muster für reguläre Ausdrücke angezeigt. Beachten Sie, dass reguläre Ausdrücke beim Parsen von Webseiten im Allgemeinen keine gute Leistung erbringen, diese Webseiten jedoch ein einfaches und einheitliches Format aufweisen.

Anstatt die Jungen- und Mädchennamen getrennt zu behandeln, fassen wir sie einfach alle zusammen. In einigen Jahren kommt ein Name mehrmals im HTML-Code vor, aber wir verwenden nur eine Zahl pro Name. Optional: Machen Sie den Algorithmus für diesen Fall intelligent und wählen Sie die kleinere Zahl aus.

Erstellen Sie das Programm als eine Reihe kleiner Meilensteine und bringen Sie jeden Schritt dazu, etwas auszuführen/zu drucken, bevor Sie den nächsten Schritt ausführen. Dieses Muster wird von erfahrenen Programmierern verwendet: Erstellen Sie eine Reihe inkrementeller Meilensteine mit jeweils zu prüfender Ausgabe, anstatt das gesamte Programm in einem großen Schritt aufzubauen.

Wenn Sie die Daten am Ende eines Meilensteins drucken, können Sie darüber nachdenken, wie Sie diese Daten für den nächsten Meilenstein neu strukturieren können. Python eignet sich gut für diese Art der inkrementellen Entwicklung. Gehen Sie beispielsweise so vor, dass das Jahr extrahiert und gedruckt wird und sys.exit(0) aufgerufen wird. Hier sind einige Vorschläge für Meilensteine:

  • Den gesamten Text aus der Datei extrahieren und drucken
  • Jahr suchen, extrahieren und ausdrucken
  • Namen und Rangnummern extrahieren und ausgeben
  • Namensdaten in ein Wörterbuch abrufen und drucken
  • Erstellen Sie die Liste [year, 'name rank', ... ] und drucken Sie sie aus.
  • Fehler in „main()“ beheben, um die ExtractNames-Liste zu verwenden

Zuvor wurden Funktionen einfach in die Standardausgabe umgewandelt. Es ist besser wiederverwendbar, wenn die Funktion die extrahierten Daten *zurückgibt*, sodass der Aufrufer sie ausdrucken oder etwas anderes damit tun kann. Für kleine Experimente während der Entwicklung können Sie weiterhin direkt aus den Funktionen heraus drucken.

Lassen Sie Main() für jedes Befehlszeilenargument aufrufen und eine Textzusammenfassung ausgeben. Eine sinnvolle Join-Funktion kann die Liste mit einer sinnvollen Zusammenfassung erstellen: text = '\n'.join(mylist) + '\n'

Der Zusammenfassungstext sollte für jede Datei wie folgt aussehen:

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

Teil B

Angenommen, wir möchten den Text nicht in der Standardausgabe ausgeben, sondern Dateien, die den Text enthalten. Wenn das Flag --summaryfile vorhanden ist, gehen Sie folgendermaßen vor: Schreiben Sie für jede Eingabedatei "foo.html", anstatt in der Standardausgabe zu drucken, eine neue Datei "foo.html.summary", die den Zusammenfassungstext für diese Datei enthält.

Sobald die Funktion --summaryfile funktioniert, führen Sie das Programm für alle Dateien mit * aus. Beispiel: "./babynames.py --summaryfile baby*.html". Dadurch werden alle Zusammenfassungen in einem Schritt erstellt. Das Standardverhalten der Shell besteht darin, dass das Muster "baby*.html" in die Liste übereinstimmender Dateinamen erweitert wird. Anschließend führt die Shell babynames.py aus und übergibt all diese Dateinamen in der Liste "sys.argv".

Wenn die Daten in Zusammenfassungsdateien organisiert sind, können Sie mit Shell-Befehlen Muster im Zeitverlauf sehen, wie hier:

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

Hinweise für reguläre Ausdrücke -- year: r'Popularität\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'