# Automate the Boring Stuff 共 24 章，只读 7 章就够

> 这 7 章讲文件、Excel、CSV 和网页，按特定顺序读，比从头读到尾更有效。

原文: https://fdetimes.net/zh/books-courses/automate-boring-stuff-seven-chapters-fde/

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 练习很像。组合起来如下，这段示例假定每个文件顶部有一行表头，数据在活动工作表上：

```python
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 文件变成一张干净表格的人，往往就是下一项工作要托付的人。

**本周动手试试:**

- 读第 11 章，写一个脚本：处理文件夹里的任何文件之前，先把整个文件夹打成 ZIP 包
- 在一个至少包含十个 Excel 文件的文件夹上运行本文的 Excel 转 CSV 脚本，然后核对总行数
- 选一个公开网站，先用 requests 抓取数据，行不通时再换 Playwright

## 信源

- [Automate the Boring Stuff with Python (official site)](https://automatetheboringstuff.com/)

- [Automate the Boring Stuff with Python, 3rd Ed (No Starch Press)](https://i-programmer.info/book-watch-archive/18069-automate-the-boring-stuff-with-python-3rd-ed-no-starch-press.html)

- [Chapter 14 - Excel Spreadsheets](https://automatetheboringstuff.com/3e/chapter14.html)

- [Chapter 13 - Web Scraping](https://automatetheboringstuff.com/3e/chapter13.html)

- [Chapter 11 - Organizing Files](https://automatetheboringstuff.com/3e/chapter11.html)

- [Chapter 18 - CSV, JSON, and XML Files](https://automatetheboringstuff.com/3e/chapter18.html)

- [Chapter 10 - Reading and Writing Files](https://automatetheboringstuff.com/3e/chapter10.html)
