Neonato che chiama l'allenamento con Python

L'amministrazione della previdenza sociale dispone di questi dati, ordinati in base all'anno, sui nomi più popolari tra i bambini nati quell'anno negli Stati Uniti (vedi nomi dei bambini di previdenza sociale).

I file per questo esercizio si trovano nella directory "babynames" all'interno di google-python-exercises (scarica google-python-exercises.zip, se non l'hai ancora fatto, vedi Configurazione per maggiori dettagli). Aggiungi il tuo codice in babynames.py. I file baby1990.html baby1992.html ... contengono codice HTML non elaborato, simile a quello che ottieni visitando il sito sulla previdenza sociale sopra indicato. Esamina il codice HTML e pensa a come potresti estrarne i dati.

Parte A

Nel file babynames.py, implementa la funzione Extra_names(filename) che prende il nome file di un file baby*.html e restituisce i dati del file come un unico elenco: la stringa dell'anno all'inizio dell'elenco seguita dalle stringhe name-rank in ordine alfabetico. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Modifica main() in modo che chiami la funzione pull_names() e stampi ciò che restituisce (main ha già il codice per l'analisi dell'argomento della riga di comando). Se non riesci a utilizzare le espressioni regolari per l'anno e ogni nome, i pattern di espressioni regolari della soluzione sono mostrati alla fine di questo documento. Tieni presente che per l'analisi delle pagine web in generale, le espressioni regolari non funzionano bene, ma queste pagine web hanno un formato semplice e coerente.

Anziché trattare i nomi di bambino e ragazza separatamente, li accorperemo tutti insieme. In alcuni anni, un nome compare più di una volta nel codice HTML, ma verrà utilizzato solo un numero per nome. Facoltativo: rendi l'algoritmo intelligente per questo caso e scegli il numero minore.

Crea il programma come una serie di piccole tappe, facendo in modo che ogni passaggio venga eseguito/stampato qualcosa prima di provare quello successivo. Questo è lo schema utilizzato dai programmatori esperti: crea una serie di traguardi incrementali, ciascuno con alcuni risultati da verificare, piuttosto che costruire l'intero programma in un unico passo importante.

Stampare i dati che hai al termine di un traguardo ti aiuta a pensare a come riorganizzarli per il prossimo traguardo. Python è adatto a questo stile di sviluppo incrementale. Ad esempio, ottieni innanzitutto il punto in cui estrae e stampa l'anno e chiama sys.exit(0). Ecco alcuni obiettivi suggeriti:

  • Estrai tutto il testo dal file e stampalo
  • Trova ed estrai l'anno e stampalo
  • Estrae i nomi e classifica i numeri e li stampa
  • Recupera i dati dei nomi in un dettato e stampalo
  • Crea l'elenco [year, 'name Rank', ... ] e stampalo
  • Correggi main() per utilizzare l'elenco ExtractNames

In precedenza avevamo le funzioni di stampa standard. È più riutilizzabile fare in modo che la funzione *restituisca* i dati estratti, in modo che il chiamante possa scegliere di stamparla o di fare qualcos'altro. Durante lo sviluppo, puoi comunque stampare direttamente dalle funzioni per i tuoi piccoli esperimenti.

Fai in modo che main() richiami la funzione pull_names() per ogni argomento della riga di comando e stampi un riepilogo testuale. Per trasformare l'elenco in un testo di riepilogo ragionevole, ecco un uso intelligente dell'unione: text = '\n'.join(mylist) + '\n'

Il testo di riepilogo di ogni file deve avere il seguente aspetto:

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

Parte B

Supponiamo, invece di stampare il testo come standard, di voler scrivere file contenenti il testo. Se è presente il flag --summaryfile, procedi nel seguente modo: per ogni file di input "foo.html", anziché stampare nell'output standard, scrivi un nuovo file "foo.html.summary" contenente il testo di riepilogo del file.

Una volta che la funzione --summaryfile è in funzione, esegui il programma su tutti i file usando * come segue: "./babynames.py --summaryfile baby*.html". In questo modo vengono generati tutti i riepiloghi in un solo passaggio. (Il comportamento standard della shell è che espande il pattern "baby*.html" nell'elenco dei nomi file corrispondenti, quindi la shell esegue babynames.py, passando tutti i nomi file nell'elenco sys.argv.)

Con i dati organizzati in file di riepilogo, puoi visualizzare i pattern nel tempo con i comandi della shell, come segue:

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

Suggerimenti dell'espressione regolare -- year: r'Popolare\sin\s(\d\d\d\d)' nomi: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'