如何用Python的Pandas读取含格式异常行的CSV文件?
解决Pandas读取列数不一致CSV的分词错误问题
问题场景
你的CSV文件列数不固定:
a,b,c a,b,c,d,e,f,g a,b,c,d a,b,c
使用pd.read_csv('Desktop/export.csv', delimiter=',')时,会抛出pandas.errors.ParserError: Error tokenizing data. C error: Expected 9 fields in line 3, saw 10,需求是保留所有行,生成包含所有列的DataFrame,列名用unnamed column1到对应最大列数的名称。
解决方案
方法:先获取最大列数,再指定列名读取
步骤如下:
- 扫描CSV文件,确定所有行中的最大列数
- 生成对应数量的列名
- 用指定列名读取文件,自动填充缺失值为NaN
代码实现:
import pandas as pd # 1. 扫描文件获取最大列数 max_column_count = 0 with open('Desktop/export.csv', 'r', encoding='utf-8') as file: for line in file: # 按逗号分割并去除首尾空白,统计列数 current_cols = len(line.strip().split(',')) if current_cols > max_column_count: max_column_count = current_cols # 2. 生成列名列表 column_names = [f'unnamed column{i+1}' for i in range(max_column_count)] # 3. 读取CSV文件,指定列名,header=None表示第一行不是表头 df = pd.read_csv( 'Desktop/export.csv', delimiter=',', names=column_names, header=None, encoding='utf-8' )
执行后得到的DataFrame会包含所有列,列数等于文件中最大的列数,列名按要求命名,列数不足的行会用NaN填充缺失的位置。
原理说明
Pandas默认会根据第一行的列数推断整个文件的列结构,当后续行列数不一致时就会触发分词错误。通过先获取最大列数并指定列名,强制Pandas按照固定列数读取所有行,缺失的列自动填充NaN,从而避免报错并保留所有数据。
内容的提问来源于stack exchange,提问作者ichino
相关产品推荐
相关产品推荐

