婴儿取名 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() 函数并输出返回的内容(main 已包含命令行参数解析的代码)。如果您难以处理年份和每个名称的正则表达式,可以在本文档末尾看到解决方案正则表达式模式。请注意,对于常规的网页解析,正则表达式效果不佳,但这些网页采用了简单且一致的格式。

我们不会将男孩和女孩的名字分开处理,而是将它们统一放在一起。有时,一个名称在 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”。这样 1 步即可生成所有摘要。(shell 的标准行为是它会将“baby*.html”模式扩展为匹配的文件名列表,然后 shell 运行 Babynames.py,在 sys.argv 列表中传入所有这些文件名。)

将数据整理成摘要文件后,您可以使用 shell 命令查看一段时间内的模式,如下所示:

$ 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>'