使用pandas.read_csv读取列数不均DAT文件触发ParserError如何解决
解决方案
该报错是因为pandas默认以第一行的字段数作为全局标准,后续行字段数和第一行不一致就会抛出异常,针对这种行数字段数不统一的文件,有两种常用的读取方案:
方案1:按文件最大列数读取(保留所有行的全部内容)
先手动统计文件里的最大字段数,读取时指定对应数量的列名即可,字段数不足的行会自动填充空值NaN,代码示例:
import pandas as pd file_path = "/home/gopakumar/Downloads/test.DAT" # 先统计文件最大列数 max_cols = 0 with open(file_path, 'r', encoding='windows-1252') as f: for line in f: cols = len(line.strip().split(';')) if cols > max_cols: max_cols = cols # 生成自定义列名,格式为col0、col1...colN col_names = [f'col{i}' for i in range(max_cols)] # 读取时指定列名即可避免列数不一致报错 df = pd.read_csv( file_path, header=None, sep=';', names=col_names, engine='python', encoding="windows-1252" )
方案2:跳过字段数异常的行(仅保留和第一行列数一致的行)
如果不需要保留列数超出第一行的内容,可以直接设置on_bad_lines参数跳过错误行:
import pandas as pd file_path = "/home/gopakumar/Downloads/test.DAT" df = pd.read_csv( file_path, header=None, sep=';', engine='python', encoding="windows-1252", on_bad_lines='skip' # pandas1.3以下老版本可替换为error_bad_lines=False )
如果需要感知哪些行被跳过,把参数值改成on_bad_lines='warn'即可,读取时会在控制台打印异常行的行号提示。
补充说明
你提供的样例文件中不同开头的行(0050/0070/0080/0090)属于不同类型的业务数据,如果后续需要分别处理,读取完成后可以按第一列的标识过滤拆分不同的子数据集使用。
内容的提问来源于stack exchange,提问作者Gopakumar N G
相关产品推荐
相关产品推荐

