登录
首页 >  文章 >  python教程

Python读取CSV文件:reader与DictReader详解

时间:2026-04-01 15:57:38 381浏览 收藏

本文深入剖析了Python中读取CSV文件的两大核心工具——csv.reader与csv.DictReader的本质区别与实战要点:reader返回易出错的列表(需下标访问),DictReader才真正支持键名访问;同时重点警示了新手极易忽略却致命的四大陷阱——必须指定newline=''防止Windows空行、合理选择encoding(如utf-8-sig自动清除BOM)、警惕字段名被不可见字符污染,以及理解二者在性能与适用场景上的取舍,帮你避开那些让调试卡壳半天的“隐形坑”。

Python怎么读取CSV文件_csv模块reader与DictReader解析

csv.reader 读出来是 list,不是 dict

csv.reader 读 CSV,每行返回的是一个 list,字段靠下标访问,比如 row[0] 是第一列。它不关心列名,哪怕第一行是表头,也照常当普通数据读——除非你手动跳过或提取。

常见错误现象:row['name']TypeError: list indices must be integers,就是误当字典用了。

  • 适合场景:列结构固定、字段少、不需要按名字取值(比如日志解析、批量数值处理)
  • 如果 CSV 有表头且你想用名字访问,别硬套 reader,换 DictReader
  • 注意编码:Windows 默认保存的 CSV 常是 gbkgb2312,用 open(..., encoding='utf-8') 会报 UnicodeDecodeError

csv.DictReader 自动把首行当字段名

DictReader 会把第一行当作 key,后续每行转成 dictrow['username'] 这样取值才自然。但它默认不跳过空行,也不自动 strip 字段两端空格。

使用场景:配置表、用户数据、需要按列名做逻辑分支的场合(比如只处理 'status' == 'active' 的行)。

  • 字段名含空格或特殊字符?DictReader 照单全收,但之后写 row['user id'] 得带空格,容易漏——建议预处理 CSV 或用 fieldnames 参数重命名
  • 想跳过首行但首行不是表头?传 fieldnames=... 并设 restkey / restval 控制多余列行为
  • 性能影响:比 reader 略慢,因为要建 dict;内存占用略高,但对万行以内数据几乎无感

open() 必须用 newline='',否则 Windows 下多空行

这是 Python 官方文档明确要求的,但几乎所有新手第一次都踩坑。不用 newline='',在 Windows 上用 csv.readerDictReader 会把 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 更可靠
事情说清了就结束。BOM、newline、编码、字段名隐式污染——这些点不显眼,但组合起来能让 CSV 解析卡半天。

以上就是《Python读取CSV文件:reader与DictReader详解》的详细内容,更多关于的资料请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>