嬰兒姓名 Python 練習

社會安全行政管理部門提供的這項寶貴資料,是每年在美國出生的嬰兒最受歡迎的年份 (請參閱社會安全寶寶名字)。

本練習的檔案位於 google-python-exercises 的「babynames」目錄中 (如果您尚未下載 google-python-exercises.zip,請參閱「設定」一文瞭解詳情)。在 babynames.py 中新增程式碼。baby1990.html baby1992.html ... 檔案包含原始 HTML,類似於您造訪上述社會安全網站時使用的格式。查看 HTML,想想如何從其中資料抓取資料。

A 部分

在 babynames.py 檔案中,實作 extract_names(filename) 函式,該函式將 baby*.html 檔案的檔案名稱做為單一清單傳回,也就是清單開頭的年份字串,後方為名稱排名字串的字母順序。['2006', 'Aaliyah 91', 'Abagail 895', 'Aaron 57', ...]. 請修改 main(),以便呼叫 extract_names() 函式並輸出傳回的內容 (主已具有指令列引數剖析的程式碼)。如果輸入年份和名稱的規則運算式時遇到問題,本文件結尾會顯示解決方案規則運算式模式。請注意,一般來說,規則運算式的剖析格式可能沒有效果好,但這些網頁的格式簡單且一致。

我們不會分別將男孩和女孩的名字全部化在一起。近年來,每個名稱在 HTML 中出現不只一次,但每個名稱只會使用一個數字。選用:讓演算法更聰明地判斷此情況,並選擇較小數字。

請將程式建構成一系列的小里程碑,然後完成每個步驟來執行/列印某些步驟,然後再嘗試下一個步驟。這是經驗豐富的程式設計人員會採用的模式,也就是建立一系列的漸進式里程碑,每項里程碑都有需要檢查的輸出結果,而非透過單一大幅步驟建構整個程式。

將某個里程碑結束時取得的資料列印出來,有助於您思考如何重新建構下一個里程碑的資料結構。Python 非常適合這種漸進式開發方式。舉例來說,先取得其擷取年份並輸出年份,然後呼叫 sys.exit(0)。以下是建議的里程碑:

  • 擷取檔案中的所有文字並列印
  • 找出並擷取年份,然後列印出來
  • 擷取名稱並進行排名數字
  • 將名稱資料取得到字典中並列印
  • 建立 [year, 'name rank', ... ] 清單並列印
  • 修正 main() 以使用 ExtractNames 清單

我們先前只提供列印至標準輸出的功能。因此,使用該函式「傳回」所擷取的資料會比較容易使用,因此呼叫端可以選擇列印該資料或執行其他操作。(在開發期間,您還是可以直接從函式中列印,以進行小幅實驗)。

為每個指令列引數設定 main() 呼叫 extract_names(),然後輸出文字摘要。為了讓清單變成合理的摘要文字,建議您巧妙運用彙整功能:text = '\n'.join(mylist) + '\n'

每個檔案的摘要文字應如下所示:

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

B 部分

假設我們想要撰寫包含文字的檔案,而不是將文字輸出成標準文字。如果含有 --summaryfile 標幟,請執行以下步驟:為每個輸入檔案「foo.html」撰寫內容,不要列印至標準輸出,而是撰寫一個包含該檔案摘要文字的新檔案「foo.html.summary」。

--summaryfile 功能正常運作後,請使用 * 範例,在所有檔案上執行程式,例如:「./babynames.py --summaryfile baby*.html」。只要一個步驟就能產生所有摘要。(殼層的標準行為是將「baby*.html」模式展開為相符檔案名稱清單,然後殼層就會執行 babynames.py,並傳入 sys.argv 清單中的所有檔案名稱)。

資料整理成摘要檔案後,您可以透過殼層指令查看隨時間變化的模式,如下所示:

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

規則運算式提示 --year: r'Popularity\sin\s(\d\d\d\d)' names: r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'