csv.DictReader能把每行转换为字典,但列数不一致时并不总会报错:多余字段可进入restkey,缺失字段用restval补齐。导入前明确处理这两种情况,才能避免把异常记录当成完整数据。

先分清缺少字段与字段为空
示例表头是name,age。“Bo”这一行缺少第二个字段;“Cy,”则提供了第二个字段,只是内容为空。两者若都变成空字符串,后续无法区分原始输入结构,因此本例使用独立的missing对象标记缺失。
import csv
from io import StringIO
missing = object()
text = "name,age\nAda,18,extra\nBo\nCy,\n"
rows = list(csv.DictReader(StringIO(text), restkey="__extra__", restval=missing))
assert rows[0]["__extra__"] == ["extra"]
assert rows[1]["age"] is missing
assert rows[2]["age"] == ""
problems = []
for record, row in enumerate(rows, start=1):
if "__extra__" in row:
problems.append((record, "extra fields"))
if any(value is missing for value in row.values()):
problems.append((record, "missing fields"))
assert problems == [(1, "extra fields"), (2, "missing fields")]
print(problems)
把异常单独列出,再决定是否接受
本地结果识别出第1条记录多字段、第2条记录缺字段;第3条结构完整,但age为空,是否允许应由业务规则决定。示例没有自动删除异常行,也没有给缺失年龄猜一个值。记录序号不一定等于物理行号,带引号的CSV字段可能跨行。
restkey要避开真实表头
如果文件本身有名为__extra__的合法列,就不要再用它存放额外字段。导入器应先检查表头是否符合约定,再选择不会冲突的保留名。正式读文件时按文档使用newline="",并明确编码,不用split逗号代替CSV解析。
列数正确仍不代表数据有效
DictReader普通读取结果中的年龄是文本,不会替你判断18是否有效整数,也不会执行字段范围检查。可以先做结构验证,再转换类型和检查业务规则,最后保存有效记录与异常报告。这样每一步的失败原因更容易复查。
资料来源与继续学习
资料查阅日期:2026年10月14日。示例、阅读练习与操作建议由本站整理。
资料查阅与编辑日期:2026年10月14日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






