使用Pandas读取CSV文件时遭遇Tokenizing错误,该修改代码还是文件?
Pandas读取CSV解析错误的解决办法
问题场景
使用Pandas读取CSV文件时反复出现解析错误,错误提示如下:
pandas.parser.CParserError: Error tokenizing data. C error: Expected 2 fields in line 3, saw 12
用到的代码:
df = pd.read_csv('ZCS006A_16_23AUG_ALL_20220804020843.csv', delimiter = ',') df.head(10)
提供的CSV文件异常内容片段:
AIRLINE_CODE,FLIGHT_NO,AIRCRAFT_TYPE_CODE,DEP_PORT_CODE,ARR_PORT_CODE,DEP_DATE,ARR_DATE,STD,STA,BLOCK_TIME,LEG,PART_NO,PART_NAME,PART_DESC,PART_SECTOR_USAGE_CODE,PART_SECTOR_USAGE_NAME,PART_CATEGORY_CODE,PAX_CLASS,EXCHANGE_TYPE_CODE,PART_QTY,PART_WEIGHT,IS_DEADHEAD LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10002993,MANTEQUILLA YC,10002993: MANTEQUILLA YC,D,Disposable,,Y,CY,143,35.75,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003049,BEBIDA BLANCA 1500CC YC,10003049: BEBIDA BLANCA 1500CC YC,D,Disposable,,Y,BX,4,6.5332,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003049,BEBIDA BLANCA 1500CC YC,10003049: BEBIDA BLANCA 1500CC YC,D,Disposable,,Y,EX,6,9.7998,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003153,COCA COLA 1500CC YC,10003153: COCA COLA 1500CC YC,D,Disposable,,Y,BX,4,6.4,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003153,COCA COLA 1500CC YC,10003153: COCA COLA 1500CC YC,D,Disposable,,Y,EX,8,12.8,0
问题根源
从提供的CSV内容能明显看出,所有数据行都没有换行,全部拼接在表头行末尾。表头最后一个字段IS_DEADHEAD后面直接跟了第一行数据的LA,没有换行符分隔,导致Pandas解析时无法识别每行的字段边界,把表头+多行数据当成一行处理,最终引发字段数量不匹配的错误。
解决方案
方案1:修复CSV文件(推荐)
直接修改CSV文件,在每条数据行的起始位置添加换行符,让每行对应一条完整数据。修复后的正确格式如下:
AIRLINE_CODE,FLIGHT_NO,AIRCRAFT_TYPE_CODE,DEP_PORT_CODE,ARR_PORT_CODE,DEP_DATE,ARR_DATE,STD,STA,BLOCK_TIME,LEG,PART_NO,PART_NAME,PART_DESC,PART_SECTOR_USAGE_CODE,PART_SECTOR_USAGE_NAME,PART_CATEGORY_CODE,PAX_CLASS,EXCHANGE_TYPE_CODE,PART_QTY,PART_WEIGHT,IS_DEADHEAD LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10002993,MANTEQUILLA YC,10002993: MANTEQUILLA YC,D,Disposable,,Y,CY,143,35.75,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003049,BEBIDA BLANCA 1500CC YC,10003049: BEBIDA BLANCA 1500CC YC,D,Disposable,,Y,BX,4,6.5332,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003049,BEBIDA BLANCA 1500CC YC,10003049: BEBIDA BLANCA 1500CC YC,D,Disposable,,Y,EX,6,9.7998,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003153,COCA COLA 1500CC YC,10003153: COCA COLA 1500CC YC,D,Disposable,,Y,BX,4,6.4,0 LA,0800,789,AKL,SCL,16-AUG-22,16-AUG-22,1840,1340,660,2,10003153,COCA COLA 1500CC YC,10003153: COCA COLA 1500CC YC,D,Disposable,,Y,EX,8,12.8,0
修复完成后,原代码即可正常运行。
方案2:修改代码处理格式异常
如果暂时无法修改CSV文件,可以通过代码先读取文件内容,手动插入换行符后再解析:
import pandas as pd from io import StringIO # 读取原始文件内容 with open('ZCS006A_16_23AUG_ALL_20220804020843.csv', 'r') as f: raw_content = f.read() # 在每条数据行的起始标识(LA,)前添加换行符(需根据实际数据起始调整规则) fixed_content = raw_content.replace(' LA,', '\nLA,') # 用StringIO模拟文件对象读取修复后的内容 df = pd.read_csv(StringIO(fixed_content), delimiter=',') df.head(10)
注意:这种方法依赖数据行的固定起始特征,若数据行起始不统一,需要调整匹配规则。
内容的提问来源于stack exchange,提问作者mjmoralesf
相关产品推荐
相关产品推荐

