使用pd.read_csv读取txt生成DataFrame遇字段数不匹配错误求助
解决pd.read_csv读取文件时的字段数不匹配问题
问题原因
报错Error tokenizing data. C error: Expected 5 fields in line 37, saw 6是因为第37行的字段数量和其他行不一致,大概率是行内存在不属于分隔符的逗号(比如内容里自带逗号但未正确处理)。
排查与解决步骤
1. 定位问题行内容
先打印第37行的具体内容,确认问题根源:
import csv with open('../sort.txt', 'r', encoding='utf-8') as f: reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE) for idx, row in enumerate(reader): if idx == 36: # 索引从0开始,第37行对应索引36 print(f"第37行内容: {row}") print(f"实际字段数: {len(row)}")
2. 快速跳过错误行(适合非关键数据)
如果不需要纠结个别错误行,直接跳过(需pandas 1.4及以上版本支持):
import pandas as pd import csv df = pd.read_csv('../sort.txt', delimiter=',', header=None, quoting=csv.QUOTE_NONE, encoding='utf-8', on_bad_lines='skip')
也可以用on_bad_lines='warn'只输出警告不跳过,方便统计错误行数量。
3. 处理内容中的逗号
如果是某个字段本身包含逗号(比如张三,北京这类未加引号的内容),手动分割并合并多余部分:
import pandas as pd rows = [] with open('../sort.txt', 'r', encoding='utf-8') as f: for line in f: line = line.strip() parts = line.split(',') # 假设正常行是5个字段,超过的话把后面的合并成最后一个字段 if len(parts) > 5: corrected_row = parts[:4] + [','.join(parts[4:])] rows.append(corrected_row) else: rows.append(parts) df = pd.DataFrame(rows)
4. 检查分隔符是否为混合格式
如果分隔符是逗号加空格(比如, ),用正则表达式作为分隔符:
import pandas as pd import csv df = pd.read_csv('../sort.txt', delimiter=r',\s*', header=None, quoting=csv.QUOTE_NONE, encoding='utf-8')
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

