pandas.read_csv读取文件时表头被识别为最后一行而非首行怎么办
换行符识别异常
CSV文件可能混合了多种换行符(Windows端\r\n、Unix端\n、旧Mac端\r),你本地pandas的默认换行符检测逻辑和同事环境不同,单独出现的\r会被误判为行结束符,导致读取提前截断,最终识别到的“表头”实际是截断后最后一行的内容。
排查方法:给read_csv添加lineterminator参数明确指定换行符,例如df = pd.read_csv("test.csv", encoding='ISO 8859-1', lineterminator='\n'),也可以用文本编辑器打开CSV查看文件实际的换行符类型。编码不匹配
ISO-8859-1是单字节兼容编码,任意字节都不会触发解码报错,如果文件实际编码为GBK、带BOM的UTF-8等,会导致特殊字符被误解析为换行符或分隔符,触发读取截断。同事环境的默认编码 fallback 逻辑和你不同,所以可以正常读取。
排查方法:用chardet库检测文件实际编码,再替换encoding参数值,带BOM的UTF-8需要用encoding='utf-8-sig'。分隔符与坏行识别问题
如果CSV分隔符不是默认逗号,或者存在未被引号包裹的分隔符冲突字符,pandas会误判列数,触发坏行跳过逻辑,仅读取到前面少量正常行,最后一行被识别为表头。
排查方法:明确指定sep参数(逗号分隔就填sep=','),新增on_bad_lines='warn'参数,运行时查看是否有坏行提示。pandas版本差异
你和同事使用的pandas版本不一致,旧版本read_csv在换行符、编码检测逻辑上存在已知bug,会触发读取异常。
排查方法:运行print(pd.__version__)对比你和同事的pandas版本,升级到和同事相同的版本重试。本地文件损坏
你本地的CSV文件在传输、下载过程中出现字节丢失,仅前146行内容完整,后续内容乱码无法正常解析。
排查方法:对比本地文件和同事文件的MD5哈希值,如果不一致重新传输文件。
内容的提问来源于stack exchange,提问作者jwww

