Python DictReader处理CSV缺列与多列

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

浅色代码编辑器与数据字段检查卡片
浅色主题概念配图,选自本站AI生成图库;非事件现场或产品实测截图。

先分清缺少字段与字段为空

示例表头是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
    喜欢就支持一下吧
    点赞0 分享