把表格交给脚本处理之前,先明确哪些数据能自动修改。本例只处理四件事:去掉字段两端空格、忽略重复编号、跳过缺编号的行,以及拒绝空姓名。它不会猜测姓名、自动改金额或替你修复业务事实。

准备一份小输入文件
在新的练习目录中创建people.csv,内容如下。第二条编号前后的空格、重复编号和最后一行空姓名,都是刻意准备的测试数据。
id,name
1,小林
2 , 小周
2,重复记录
3,
字段内若包含逗号,应遵守CSV的引号规则,而不是自己用字符串split处理。Python标准库的csv模块会处理这些格式细节。
编写清洗脚本
import csv
import json
from pathlib import Path
source = Path("people.csv")
output = Path("people.json")
rows = []
seen = set()
with source.open(encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
if not {"id", "name"}.issubset(reader.fieldnames or []):
raise ValueError("CSV必须包含id和name两列表头")
for row in reader:
ident = (row.get("id") or "").strip()
name = (row.get("name") or "").strip()
if not ident or not name or ident in seen:
continue
seen.add(ident)
rows.append({"id": ident, "name": name})
output.write_text(
json.dumps(rows, ensure_ascii=False, indent=2),
encoding="utf-8",
)
print(f"保留 {len(rows)} 条,输出到 {output}")
保存为clean_csv.py后,在同一目录运行python3 clean_csv.py。脚本会覆盖当前目录同名的people.json;请先用练习文件,不要直接覆盖重要业务数据。
核对输出,而不是只看执行成功
给定上面的输入,输出应只保留编号1和2,其中编号2的姓名是“小周”。编号按字符串保存,因此“001”和“1”会被视为不同值;是否应合并需要由业务规则决定。
[
{"id": "1", "name": "小林"},
{"id": "2", "name": "小周"}
]
这个输入与结果已作为本地小样例运行核对。若实际表格有额外列,本例只导出id和name两列,不能当作保留所有原始字段的通用转换器。
接入真实数据前补两项记录
正式任务至少应记录跳过了多少行、每一类跳过原因是什么,并为输出使用新的文件名。数据量大时,还要考虑是否需要分块处理或数据库,而不是一次把全部数据装进内存。
最值得保留的是这份小测试数据。以后修改规则,先运行它确认基本行为没有改变,再用脱敏后的真实样本验证。
资料与延伸阅读
继续阅读:先给项目创建虚拟环境 · 数据质量如何影响知识库回答
资料查阅与编辑日期:2026年9月22日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






