csv.reader返回list,需用下标访问;DictReader才返回dict并以首行为键;务必用newline=''和合适encoding(如utf-8-sig防BOM),否则易出错。

csv.reader 读出来是 list,不是 dict
用 csv.reader 读 CSV,每行返回的是一个 list,字段靠下标访问,比如 row[0] 是第一列。它不关心列名,哪怕第一行是表头,也照常当普通数据读——除非你手动跳过或提取。
常见错误现象:row['name'] 报 TypeError: list indices must be integers,就是误当字典用了。
- 适合场景:列结构固定、字段少、不需要按名字取值(比如日志解析、批量数值处理)
- 如果 CSV 有表头且你想用名字访问,别硬套
reader,换DictReader - 注意编码:Windows 默认保存的 CSV 常是
gbk或gb2312,用open(..., encoding='utf-8')会报UnicodeDecodeError
csv.DictReader 自动把首行当字段名
DictReader 会把第一行当作 key,后续每行转成 dict,row['username'] 这样取值才自然。但它默认不跳过空行,也不自动 strip 字段两端空格。
使用场景:配置表、用户数据、需要按列名做逻辑分支的场合(比如只处理 'status' == 'active' 的行)。
立即学习“Python免费学习笔记(深入)”;
- 字段名含空格或特殊字符?
DictReader照单全收,但之后写row['user id']得带空格,容易漏——建议预处理 CSV 或用fieldnames参数重命名 - 想跳过首行但首行不是表头?传
fieldnames=...并设restkey/restval控制多余列行为 - 性能影响:比
reader略慢,因为要建 dict;内存占用略高,但对万行以内数据几乎无感
open() 必须用 newline='',否则 Windows 下多空行
这是 Python 官方文档明确要求的,但几乎所有新手第一次都踩坑。不用 newline='',在 Windows 上用 csv.reader 或 DictReader 会把 CRLF 当两行,导致隔行出现空 list 或空 dict。
错误现象:for row in reader: print(repr(row)) 输出一堆 [] 或 {}。
- 正确写法:
with open('data.csv', newline='', encoding='utf-8') as f: -
newline=''不影响内容编码,和encoding各司其职,不能省也不能混用 - Linux/macOS 下可能不明显,但代码跨平台时必须加
中文字段名 + 中文内容,DictReader 也可能乱码
即使文件是 UTF-8,如果用 Excel 保存过 CSV,它可能偷偷加了 BOM(\ufeff),导致 DictReader.fieldnames 第一个字段变成 '\ufeff姓名',后续 row['姓名'] 就 KeyError。
解决方法不是改 Excel 设置,而是代码里容错:
- 打开时用
encoding='utf-8-sig',Python 会自动剥离 BOM - 或者手动检查:
if fieldnames and fieldnames[0].startswith('\ufeff'):再切片 - 字段名含不可见字符?打印
repr(fieldnames)比直接 print 更可靠










