Latihan Python Nama Bayi

Administrasi Jaminan Sosial memiliki data rapi ini berdasarkan tahun tentang nama apa yang paling populer untuk bayi yang lahir di AS (lihat nama bayi jaminan sosial).

File untuk latihan ini ada di "babynames" di dalam google-python-exercises (download google-python-exercises.zip jika belum, lihat Menyiapkan untuk detailnya). Tambahkan kode Anda di babynames.py. File baby1990.html baby1992.html ... berisi html mentah, mirip dengan apa yang Anda dapatkan di situs jaminan sosial di atas. Lihat kode HTML dan pikirkan tentang bagaimana Anda dapat mengambil data dari kode tersebut.

Bagian A

Dalam file babynames.py, implementasikan fungsi extract_names(filename) yang mengambil nama file dari file baby*.html dan menampilkan data dari file tersebut sebagai satu daftar -- string tahun pada awal daftar diikuti dengan string peringkat nama dalam urutan abjad. ['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. Modifikasi main() agar memanggil fungsi extract_names() dan mencetak apa yang ditampilkannya (utama sudah memiliki kode untuk penguraian argumen baris perintah). Jika Anda kesulitan membuat ekspresi reguler untuk tahun dan setiap nama, pola ekspresi reguler solusi akan ditampilkan di akhir dokumen ini. Perlu diketahui bahwa untuk mengurai halaman web secara umum, ekspresi reguler tidak berfungsi dengan baik, tetapi halaman web ini memiliki format yang sederhana dan konsisten.

Kami tidak akan memperlakukan nama anak laki-laki dan perempuan secara terpisah, tetapi kami akan menggabungkan semuanya. Dalam beberapa tahun, sebuah nama muncul lebih dari sekali di {i>html<i}, tetapi kita hanya akan menggunakan satu nomor per nama. Opsional: buat algoritma cerdas tentang kasus ini dan pilih angka mana yang lebih kecil.

Buat program sebagai serangkaian tonggak pencapaian kecil, yang membuat setiap langkah menjalankan/mencetak sesuatu sebelum mencoba langkah berikutnya. Ini adalah pola yang digunakan oleh pemrogram berpengalaman -- membangun serangkaian {i>milestone<i} tambahan, masing-masing dengan beberapa {i>output<i} untuk diperiksa, daripada membangun seluruh program dalam satu langkah besar.

Mencetak data yang Anda miliki di akhir satu {i>milestone<i} membantu Anda memikirkan cara menyusun ulang data itu untuk {i>milestone<i} berikutnya. Python sangat cocok dengan gaya pengembangan inkremental ini. Misalnya, pertama-tama sampai pada titik di mana ia mengekstrak dan mencetak tahun dan memanggil sys.exit(0). Berikut beberapa {i>milestone<i} yang disarankan:

  • Ekstrak semua teks dari file dan cetak
  • Temukan dan ekstrak tahun tersebut lalu cetak
  • Ekstrak nama dan peringkat angka, lalu cetak
  • Masukkan data nama ke dalam dikte dan cetak
  • Buat daftar [tahun, 'peringkat nama', ... ], lalu cetak
  • Memperbaiki main() untuk menggunakan daftar ExtractNames

Sebelumnya kita telah memiliki fungsi yang hanya dicetak ke {i>standard out<i}. Akan lebih mudah digunakan kembali jika fungsi *menampilkan* data yang diekstrak, sehingga pemanggil memiliki pilihan untuk mencetaknya atau melakukan tindakan lain dengannya. (Anda masih dapat mencetak langsung dari dalam fungsi untuk eksperimen kecil selama pengembangan.)

Minta main() memanggil extract_names() untuk setiap argumen baris perintah dan mencetak ringkasan teks. Untuk membuat daftar menjadi teks ringkasan yang terlihat wajar, berikut penggunaan gabungan yang cerdas: text = '\n'.join(mylist) + '\n'

Teks ringkasan akan terlihat seperti ini untuk setiap file:

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

Bagian B

Misalkan alih-alih mencetak teks ke standard out, kita ingin menulis file yang berisi teks. Jika tanda --summaryfile ada, lakukan hal berikut: untuk setiap file input 'foo.html', alih-alih mencetak ke output standar, tulis file baru 'foo.html.summary' yang berisi teks ringkasan untuk file tersebut.

Setelah fitur --summaryfile berfungsi, jalankan program pada semua file menggunakan * seperti ini: "./babynames.py --summaryfile baby*.html". Tindakan ini akan menghasilkan semua ringkasan dalam satu langkah. (Perilaku standar {i>shell<i} adalah bahwa ia memperluas pola "baby*.html" ke dalam daftar nama file yang cocok, dan kemudian {i>shell<i} menjalankan babynames.py, yang meneruskan semua nama file dalam daftar sys.argv.)

Dengan data yang diatur ke dalam file ringkasan, Anda dapat melihat pola dari waktu ke waktu dengan perintah shell, seperti ini:

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

Petunjuk ekspresi reguler -- tahun: r'Popularitas\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'