解析数据报错:如何移除CSV文件行中多余的制表符?
解决方案
方法1:预处理文件修复多余制表符
先读取文件内容,将每行中超出正常字段数的制表符替换为空格(按你描述正常是12个字段,对应11个制表符),处理后再读取:
# 读取原始文件 with open('8176.xls', 'r', encoding='cp1252') as f: lines = f.readlines() # 逐行处理:多余制表符合并到最后一个字段 processed_lines = [] for line in lines: if line.strip() == '': processed_lines.append(line) continue parts = line.split('\t') if len(parts) > 12: new_line = '\t'.join(parts[:11] + [' '.join(parts[11:])]) + '\n' else: new_line = line processed_lines.append(new_line) # 保存处理后的文件 with open('processed_8176.xls', 'w', encoding='cp1252') as f: f.writelines(processed_lines) # 读取处理后的数据集 import pandas as pd df = pd.read_csv('processed_8176.xls', header=None, sep='\t', encoding='cp1252')
方法2:直接用自定义逻辑读取(无需预处理)
通过逐行解析处理异常行,直接生成DataFrame:
import pandas as pd def parse_single_line(line): parts = line.strip('\n').split('\t') if len(parts) > 12: return parts[:11] + [' '.join(parts[11:])] elif len(parts) < 12: return parts + ['']*(12 - len(parts)) return parts # 逐行读取解析 data = [] with open('8176.xls', 'r', encoding='cp1252') as f: for line in f: if line.strip() == '': data.append(['']*12) continue data.append(parse_single_line(line)) df = pd.DataFrame(data)
方法3:跳过错误行后单独修复
如果只有少量异常行,可先跳过错误行读取主数据,再单独修复异常行合并:
# 先读取正常行 df = pd.read_csv('8176.xls', header=None, sep='\t', encoding='cp1252', on_bad_lines='skip') # 定位并读取第6623行(索引从0开始对应6622) error_line = None with open('8176.xls', 'r', encoding='cp1252') as f: for idx, line in enumerate(f): if idx == 6622: error_line = line break # 修复异常行并合并到主数据 parts = error_line.split('\t') fixed_line = parts[:11] + [' '.join(parts[11:])] df = pd.concat([df, pd.DataFrame([fixed_line])], ignore_index=True)
注:你的文件是制表符分隔却用.xls后缀,建议后续保存为.tsv格式避免格式混淆。
内容的提问来源于stack exchange,提问作者Ken eXs
相关产品推荐
相关产品推荐

