单工作站运行Python pandas读CSV脚本报ParserError排障问询
这个报错和内存、Python版本、pandas依赖版本没有任何关系,核心原因是你读取的目标文件根本不是你要处理的业务CSV。
首先拆解报错信息:pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 5, saw 4 意思是pandas按逗号分隔符解析文件时,判定文件应该只有1列(前4行完全没出现逗号分隔符),结果读到第5行时切出了4个字段,列数不匹配直接抛错。
你遇到的“最开始裁到500行能跑,后来1行也报错”的现象,本质是测试过程中路径和文件弄混了:你可以自己核对下,报错栈里读的路径是C:/Path/file.csv,你贴的代码里写的读入路径是C:/Users/Script.csv,两个路径根本不一致。之前测500行能跑,是因为当时对应路径下放的是你裁剪后的正确测试文件;后续反复测试、生成输出文件的过程中,你把目标路径下的文件替换成了错误文件——大概率是误把脚本文件、无格式的文本文件、或者之前输出的带冗余内容的临时文件改了后缀放在读入路径下了。
能触发“预期1个字段”这类报错的文件,前4行必然是不带逗号的纯文本,和你说的2500行、1MB大小的结构化业务CSV完全不符:如果是正确的业务CSV,第一行表头就会带出十几个分隔符,pandas从第一行就会识别到多列,根本不可能得出“预期1个字段”的判断。
你之前调的error_bad_lines=False、chunksize、low_memory=False这些参数全不生效也很正常:从根上读错了文件,再怎么调解析参数都解决不了问题。
- 先在
pd.read_csv代码前加几行打印,直接确认你实际读到的文件内容:
# 打印目标文件前10行,看是不是你要的业务数据 test_path = "C:/Path/file.csv" # 替换成你read_csv里写的实际路径 with open(test_path, "r", encoding="latin-1") as f: for line_num in range(10): line = f.readline() if not line: break print(f"行{line_num+1}: {repr(line)}")
跑完你就能看到,打出来的内容根本不是你要处理的CSV数据。
- 核对读入路径的绝对地址,重点排查Windows默认隐藏文件扩展名导致的文件名错误:比如你以为存的是
data.csv,实际因为隐藏扩展名存成了data.csv.txt,或是误把Python脚本script.py错存成了script.csv放在目标路径下。 - 如果确认文件是对的,只是CSV前4行是冗余的说明文字、不是数据内容,读文件时加
skiprows=4参数跳过前面的非数据行即可,不需要折腾分块读取、内存调优类的操作。
其他虚拟机、个人工作站的对应读入路径下,存放的是正确的业务CSV文件,只有这台故障机的目标路径下文件是错的,和机器内存、Python环境、依赖版本没有关联。
内容的提问来源于stack exchange,提问作者feelsgood

