美國社會安全局根據每年出生的嬰兒,取得了美國當地最受歡迎的相關資料 (詳情請參閱 社會安全嬰兒名字)。
本練習的檔案位於「babynames」google-python-exercises 內的目錄 (如果還沒有下載 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 清單
我們先前有函式會輸出至標準格式。讓函式「傳回」擷取的資料比較可重複使用,因此呼叫端可選擇列印該資料或執行其他操作。(您還是可以直接從函式中列印,在開發期間進行小規模實驗)。
為每個指令列 arg 呼叫 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」。透過一個步驟即可產生所有摘要。(shell 的標準行為是將「baby*.html」模式展開為相符檔案名稱清單,然後殼層執行 babynames.py,並傳入 sys.argv 清單中的所有檔案名稱)。
在將資料歸納為摘要檔案後,您可以使用 shell 指令查看一段時間以來的模式,如下所示:
$ grep 'Trinity ' *.summary $ grep 'Nick ' *.summary $ grep 'Miguel ' *.summary $ grep 'Emily ' *.summary
規則運算式提示 -- 年:r'Popularity\sin\s(\d\d\d\d)'名稱:r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>'