Die Social Security Administration verfügt über diese netten Daten nach Jahr darüber, welche Namen für Babys, die in diesem Jahr in den USA geboren wurden, am beliebtesten sind (siehe Babynamen im Bereich der Sozialversicherung.
Die Dateien für diese Übung befinden sich unter „babynames“. im Verzeichnis „google-python-exercises“. Laden Sie die Datei google-python-exercises.zip herunter, falls Sie dies 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 RAW-HTML-Code, ähnlich dem, was Sie auf der oben genannten Website der Sozialversicherung finden. Sehen 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 Funktion „extract_names(filename)“, die den Dateinamen einer Baby*.html-Datei verwendet und die Daten aus der Datei als einzelne Liste zurückgibt - die Zeichenfolge mit dem Jahr am Anfang der Liste, gefolgt von den Zeichenfolgen für den Namensrang in alphabetischer Reihenfolge. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Ändern Sie „main()“ so, dass sie die Funktion „extract_names()“ aufruft und das zurückgegebene Ergebnis ausgibt. „main enthält bereits den Code für das Parsen des Befehlszeilenarguments.“ Wenn Sie beim Ausarbeiten der regulären Ausdrücke für das Jahr und jeden Namen nicht weiterkommen, finden Sie am Ende dieses Dokuments die Muster für reguläre Ausdrücke für die Lösung. Beachten Sie, dass reguläre Ausdrücke für das Parsen von Webseiten im Allgemeinen kein gutes Ergebnis sind. Diese Webseiten weisen jedoch ein einfaches und einheitliches Format auf.
Anstatt die Jungen- und Mädchennamen separat zu behandeln, fassen wir sie einfach alle zusammen. In einigen Jahren kommt ein Name im HTML mehrfach vor. Wir verwenden jedoch nur eine Zahl pro Namen. 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/auszudrucken, bevor Sie mit dem nächsten Schritt fortfahren. Dies ist das Muster, das von erfahrenen Programmierern verwendet wird. Erstellen Sie eine Reihe inkrementeller Meilensteine, von denen jeder eine Ausgabe überprüfen muss, anstatt das gesamte Programm in einem großen Schritt zu erstellen.
Wenn Sie die Daten am Ende eines Meilensteins ausdrucken, 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. Bringen Sie es beispielsweise zuerst so weit, dass es das Jahr extrahiert und ausgibt und sys.exit(0) aufruft. Hier sind einige Vorschläge für Meilensteine:
- Den gesamten Text aus der Datei extrahieren und drucken
- Jahr suchen, extrahieren und ausdrucken
- Namen extrahieren, Nummern ordnen und ausdrucken
- Namensdaten in ein Dictionary abrufen und ausgeben
- Liste [year, 'name rank', ... ] erstellen und ausdrucken
- Korrigieren Sie „main()“, um die Liste „ExtractNames“ zu verwenden
Zuvor hatten wir Funktionen, die einfach in Standardausgabe ausgegeben werden. Es ist einfacher, die extrahierten Daten von der Funktion *zurückgeben* zu lassen, sodass der Aufrufer die Möglichkeit hat, sie auszudrucken oder anderweitig damit zu arbeiten. Für kleine Experimente während der Entwicklung können Sie trotzdem direkt aus Ihren Funktionen heraus drucken.
Lassen Sie "main()" für jedes Befehlszeilenargument extra() aufrufen und geben Sie eine Textzusammenfassung aus. Um die Liste in einen vernünftigen Zusammenfassungstext zu verwandeln, können Sie Joins verwenden: 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 drucken, sondern Dateien schreiben, die den Text enthalten. Wenn das Flag --summaryfile vorhanden ist, gehen Sie wie folgt vor: Schreiben Sie für jede Eingabedatei "foo.html" eine neue Datei "foo.html.summary", anstatt in der Standardausgabe auszugeben. der 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. Standardmäßig wird das Muster "baby*.html" in die Liste der übereinstimmenden Dateinamen erweitert. Anschließend führt die Shell die Datei "babynames.py" aus und übergibt alle diese Dateinamen in der Liste "sys.argv".
Wenn die Daten in Zusammenfassungsdateien organisiert sind, können Sie mit Shell-Befehlen wie folgt Muster im Zeitverlauf sehen:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
Hinweise auf reguläre Ausdrücke – Jahr: r'Beliebtheit\sin\s(\d\d\d\d)' Namen: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'