如何通过pandas read_csv读取含未知多字段的CSV且不跳过行?
当然可以用pandas的read_csv实现这个需求!不用退回到csv.reader,只需要先提前确定CSV里的最大字段数,再给pandas指定完整的列名列表就行,具体步骤如下:
解决思路
pandas默认会根据表头的列数来解析每行数据,如果某行列数和表头不一致,就会判定为"坏行"并跳过(在设置on_bad_lines='skip'时)。要保留这些行,我们需要先告诉pandas:实际存在的最大列数是多少,让它为额外的字段预留列。
具体代码实现
import pandas as pd from io import StringIO # Python3用这个,Python2用from StringIO import StringIO # 你的原始CSV数据 data_content = """a,b,c 1,2,3 4,5,6 6,7,8,9 1,2,5 3,4,5""" # 第一步:分析CSV,获取最大列数和表头 rows = data_content.strip().split('\n') header_cols = rows[0].split(',') base_col_count = len(header_cols) # 遍历所有行,找到字段数最多的那一行的列数 max_col_count = max(len(row.split(',')) for row in rows) # 第二步:生成完整的列名列表 # 额外列可以按"UNK_1、UNK_2..."命名,也可以自定义前缀 extra_col_names = [f'UNK_{i+1}' for i in range(max_col_count - base_col_count)] all_col_names = header_cols + extra_col_names # 第三步:用read_csv读取,指定列名和表头行 data = StringIO(data_content) df = pd.read_csv(data, names=all_col_names, header=0) print(df)
输出结果
a b c UNK_1 0 1 2 3 NaN 1 4 5 6 NaN 2 6 7 8 9 3 1 2 5 NaN 4 3 4 5 NaN
补充说明
- 如果你的CSV里存在更多额外字段(比如某行有5个值),代码会自动生成对应数量的
UNK_*列,完美适配任意数量的未知额外字段。 - 如果你不想给额外列编号,想统一用一个固定名称(比如仅
UNK),这种情况仅适用于最多一个额外字段的场景——如果有多个额外字段,pandas会因列数不匹配报错,所以编号的方式更通用。 - 注意Python版本的
StringIO导入差异:Python2用from StringIO import StringIO,Python3用from io import StringIO。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

