Latihan Python Nama Bayi

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

File untuk latihan ini ada di direktori "babynames" di dalam google-python-exercises (download google-python-exercises.zip jika Anda belum melakukannya, lihat bagian Menyiapkan untuk mengetahui detailnya). Tambahkan kode di babynames.py. File baby1990.html baby1992.html ... mengandung html mentah, mirip dengan apa yang Anda dapatkan mengunjungi situs jaminan sosial di atas. Lihatlah html dan pikirkan tentang bagaimana Anda bisa mengikis data dari sana.

Bagian A

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

Daripada memperlakukan nama anak laki-laki dan perempuan secara terpisah, kita akan menggabungkan semuanya. Dalam beberapa tahun, sebuah nama muncul lebih dari sekali di HTML, tetapi kita hanya akan menggunakan satu nomor untuk setiap nama. Opsional: buat algoritma cerdas dalam kasus ini dan pilih angka mana pun yang lebih kecil.

Buat program sebagai serangkaian pencapaian kecil, sehingga setiap langkah dapat menjalankan/mencetak sesuatu sebelum mencoba langkah berikutnya. Ini adalah pola yang digunakan oleh programer berpengalaman -- membangun serangkaian {i>milestone<i} inkremental, masing-masing dengan beberapa {i>output<i} untuk diperiksa, bukan membangun keseluruhan program dalam satu langkah besar.

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

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

Sebelumnya, kita memiliki fungsi yang hanya dicetak untuk {i>standard out<i}. Akan lebih mudah digunakan kembali jika fungsi *mengembalikan* data yang diekstrak, sehingga pemanggil memiliki pilihan untuk mencetaknya atau melakukan hal 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 ini penggunaan join yang cerdas: text = '\n'.join(mylist) + '\n'

Teks ringkasan untuk setiap file akan terlihat seperti ini:

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

Bagian B

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

Setelah fitur --summaryfile bekerja, jalankan program pada semua file menggunakan * seperti ini: "./babynames.py --summaryfile baby*.html". Tindakan ini akan menghasilkan semua ringkasan dalam satu langkah. (Perilaku standar shell adalah bahwa ia memperluas pola "baby*.html" ke dalam daftar nama file yang cocok, dan kemudian shell menjalankan babynames.py, meneruskan semua nama file tersebut 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)' nama: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'