Automate the Boring Stuff 共 24 章,只读 7 章就够
这 7 章讲文件、Excel、CSV 和网页,按特定顺序读,比从头读到尾更有效。
要点速览
- No Starch Press 出版的第三版(2025 年 5 月)可在线免费阅读,采用 Creative Commons 许可
- 第 10、11、14、18 章处理文件和电子表格;第 13 章讲网页,包括 Playwright
- 三个值得养成的习惯:先查文件大小,动手前先备份,自动化浏览器之前先试 API
Al Sweigart 在这本书的官网上写道,编程最美妙的部分,是看到机器做成一件有用的事时的那种成就感。对前线部署工程师(FDE)来说,这一刻往往出现在进驻客户现场的第一周:有人发来一个塞满 Excel、PDF 和 CSV 文件的文件夹,问能不能拿它做点什么。
Automate the Boring Stuff with Python 目前已出到第三版,号称“全面修订”,由 No Starch Press 于 2025 年 5 月出版。全书可在官网按 Creative Commons BY-NC-SA 3.0 许可免费阅读,官网也提供了出版社纸质版的链接。全书共 24 章,另有两个附录。
不必通读全书。有 7 章直接对应部署初期的工作:读取文件、整理文件夹、打开电子表格、转换格式、从网页抓取数据。做演示时用不上这些,真正部署时却绕不开。
为什么一本讲“无聊事”的书适合 FDE
Agent 或 RAG 数据管道的效果,取决于喂给它的数据,而客户数据很少整整齐齐地放在 API 后面。
常见的情况是:财务每月导出的 Excel 报表,PDF 和 Word 格式的合同,或者一个完全没有文档的内部网页门户。想做有意思的部分,得先过这一关。
Sweigart 这本书教的正是这一部分,而且靠具体项目而不是理论。所以,把下面 7 章当作第一周的工具箱,从基础开始按顺序读。
| 章节 | 主要内容 | 在客户现场的用途 |
|---|---|---|
| 10. Reading and Writing Files | 路径、读写、shelve 模块 | 读取客户发来的所有文件,保存临时状态 |
| 11. Organizing Files | shutil、遍历目录树、zipfile | 批量处理客户丢过来的文件夹 |
| 18. CSV, JSON, and XML | 三种文本格式、去掉 CSV 表头、Excel 转 CSV | 数据入库前先做规范化 |
| 14. Excel Spreadsheets | openpyxl、公式、冻结窗格、图表 | 读取和修改各部门的报表 |
| 15. Google Sheets | 云端电子表格 | 客户使用 Google Workspace 时 |
| 17. PDF and Word Documents | 办公文档 | 合同、流程文件、用于 RAG 的文档 |
| 13. Web Scraping | requests、API、Beautiful Soup、Selenium、Playwright | 从没有导出功能的网页门户抓取数据 |
第 18 章排在第 14 章之前是有意为之。一旦习惯了 CSV、JSON 和 XML 不过是纯文本,就会明白处理 Excel 主要就是把数据从 Excel 里取出来。
实例:40 家分店的 40 个文件
假设客户是一家零售连锁企业,发来 40 个 Excel 销售文件,每家分店一个。他们想要一张合并后的总表,导入自己的分析系统。手工处理要打开 40 个文件、复制 40 次,而且至少会出一次错。
借助书中的三章,这件事只需一段短脚本。第 11 章讲如何遍历整个目录树,收集全部 40 个文件,包括藏在子文件夹深处的。第 14 章用 openpyxl 读取每个工作表,其中两个项目(统计人口普查数据、更新电子表格)和这个问题几乎一模一样。
第 18 章把结果写入一个 CSV 文件,和该章末尾的 Excel 转 CSV 练习很像。组合起来如下,这段示例假定每个文件顶部有一行表头,数据在活动工作表上:
import csv, os, shutil
from pathlib import Path
import openpyxl
SRC = Path('customer_data')
# 第 0 步:动任何文件之前,先备份原件
shutil.make_archive('original_backup', 'zip', SRC)
with open('combined.csv', 'w', newline='', encoding='utf-8') as out:
writer = csv.writer(out)
for folder, _, files in os.walk(SRC): # 第 11 章:连子文件夹一起遍历
for name in files:
if not name.endswith('.xlsx'):
continue
wb = openpyxl.load_workbook(Path(folder) / name, data_only=True) # 第 14 章
ws = wb.active
for row in ws.iter_rows(min_row=2, values_only=True): # 跳过表头行
writer.writerow([name, *row]) # 第 18 章:加一列文件名
每行开头的文件名列是个值得保留的小细节。客户问某家分店的数字为什么不对时,可以直接顺着这一行追溯到源文件,不用把 40 个文件重新打开一遍。
在客户现场,第一件事不是写循环。先像第 11 章的备份项目那样,把整个原始文件夹打成 ZIP 包,然后再动任何文件。
三个值得记住的观点
第一个来自第 10 章:Sweigart 说,可以把文件内容看成一个字符串,而这个字符串可能有好几 GB。这提醒我们,在把文件全部读进内存之前,先问清客户文件有多大。一个在样例文件上运行正常的脚本,碰到一整年的导出数据照样可能崩溃。
第二个是任何批量操作之前都要备份。对整个目录树批量操作很强大,也正因如此可能造成破坏。脚本出错时,一份未改动原件的 ZIP 包,是保住客户信任成本最低的办法。
最后一个来自第 13 章介绍工具的顺序:先讲 requests 和一个 API 示例,再讲 Beautiful Soup、Selenium 和 Playwright。在客户现场,这个顺序应该成为习惯:先问有没有 API 或导出按钮,再解析 HTML,实在没有别的办法时才自动化浏览器。
把练习用到客户现场时的常见错误
最常见的错误是:只用两个样例文件测试脚本,就直接拿去跑一整年的导出数据,还把全部内容读进内存。先问清文件大小和行数,再用一个小文件夹试运行。
第二个错误是一头扎进网页门户的抓取,而客户的用户其实早有一个导出按钮,只是没人想到去问。在客户调研阶段多问一句,可能省下一周写 Playwright 代码的时间。
最后一个是不核对结果。合并 40 个文件之后,CSV 的总行数必须等于各文件数据行数之和;对不上,就不要发给客户。
谁该读,以及怎么写进简历
如果每天都写 Python,第 10 章快速浏览即可,直接读第 11、18、14 章。如果来自前端或 Java 背景,按上表顺序把 7 章都仔细读一遍。第 15 章和第 17 章可以等客户真的用 Google Sheets,或者手里有一堆合同时再读。
写简历时,不要写“读过 Automate the Boring Stuff”。拿公开数据重做其中一个练习,推送到 GitHub,在 README 里写明处理了多少文件、节省了多少时间,再把它浓缩成一行成果。
当 FDE 岗位描述提到客户数据混乱或遗留系统时,这一行能让招聘方看到,这类工作你已经做过。
在客户现场,第一个把 40 个 Excel 文件变成一张干净表格的人,往往就是下一项工作要托付的人。
这篇文章对你有帮助吗?
感谢你的反馈!