为何pandas.read_csv在测试与主代码中读取空值表现不一致?
测试与主程序中pandas.read_csv读取CSV的差异原因分析
核心原因:CSV格式不规则 + 环境/参数默认行为差异
以下是具体的几点可能:
实际读取的文件并非同一文件
虽然你提到测试和主代码用的是相同CSV列表,但测试脚本在独立文件夹,主程序的工作目录可能不同。如果filelist里用的是相对路径,主程序执行时会从自身工作目录找文件,可能读到的是另一个版本的CSV(比如上级目录的同名文件),导致格式不一致。pandas版本或解析引擎的默认行为差异
测试环境和主程序的pandas版本可能存在差异:
- 旧版pandas遇到不规则列数的CSV时,配合
dtype指定多列类型,可能自动用NaN填充缺失列,不会触发usecols匹配错误; - 新版pandas对
usecols的校验更严格,如果解析时推断的列数少于usecols指定的数量,直接报错。
另外,测试时可能因为dtype参数的存在,隐式触发了Python引擎(而非默认的C引擎),Python引擎对不规则行的兼容性更好;而主程序中默认用C引擎,对列数推断更严格,导致冲突。
- CSV文件行格式不规则,测试时刚好命中兼容场景
你的CSV本身没有固定列数,不同段落的列数不一样:
- 测试代码读取前15行,其中包含了有4列的行(比如第0行),pandas据此推断列数为4,所以
usecols=(0,1,2,3)能匹配; - 主程序中可能因为文件被修改、读取时的指针位置问题,pandas解析时先读到了只有1列的行,推断列数为1,导致
usecols指定的列不存在,触发报错。
简化后续代码的建议
既然CSV是分段落有固定列数的结构,你可以:
- 先读取整个文件为纯文本行,按段落分割后再分别解析成DataFrame;
- 统一使用Python引擎(
engine='python'),配合warn_bad_lines=True跳过解析错误的行,再按位置处理数据; - 确认测试和主程序的工作目录一致,确保读取的是同一个CSV文件,同时对齐两边的pandas版本和解析参数。
内容的提问来源于stack exchange,提问作者jhollidge
相关产品推荐
相关产品推荐

