You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas读取带/分隔符的TXT文件遇解析错误的技术咨询

解决CSV解析错误并实现指定行作为表头的方案

错误原因

你遇到的ParserError是因为文件中不同行的字段数量不一致:

  • 比如DATE开头的行按/分割后是4个字段,而DATA开头的行分割后是5个字段
  • pd.read_csv默认会根据第一行的字段数解析所有行,当后续行字段数不匹配时就会抛出错误
  • 直接用sep='/''不会处理/前后的空格,会导致字段分割后带有多余空格,进一步加剧解析问题

解决方案

以下两种方法都能解决问题,同时实现将DATA行作为其下方数据行的表头,并保留每个数据块的元数据(日期、时间、K1等):

方法一:手动逐行处理(更灵活)

import pandas as pd

# 读取文件并预处理每行
lines = []
with open(r'<path>', 'r') as f:
    for line in f:
        stripped_line = line.strip()
        # 跳过空行和分隔线
        if not stripped_line or stripped_line.startswith('---'):
            continue
        # 按/分割并去掉每个字段的前后空格
        parts = [p.strip() for p in stripped_line.split('/')]
        lines.append(parts)

# 整理结构化数据
data_rows = []
current_meta = {}  # 存储当前数据块的元数据(日期、时间等)
header = None

for parts in lines:
    if parts[0] == 'DATE':
        # 提取日期和时间
        current_meta['DATE'] = parts[1]
        current_meta['TIME'] = parts[3]
    elif parts[0] == 'K1':
        # 提取K1和Picker信息
        current_meta['K1'] = parts[1]
        current_meta['PICKER'] = parts[2]
    elif parts[0] == 'DATA':
        # 设置当前数据块的表头
        header = parts
    else:
        # 将数据行与表头匹配,合并元数据
        if header:
            row_dict = dict(zip(header, parts))
            row_dict.update(current_meta)
            data_rows.append(row_dict)

# 转换为DataFrame
df = pd.DataFrame(data_rows)

方法二:利用pandas读取后再处理

import pandas as pd

# 用正则分隔符读取所有行,忽略/前后的空格
df_raw = pd.read_csv(
    r'<path>',
    sep=r'\s*/\s*',
    header=None,
    engine='python',  # 必须用python引擎支持正则分隔符
    skip_blank_lines=True
)

# 过滤掉分隔线行
df_raw = df_raw[~df_raw[0].str.startswith('---', na=False)]

# 整理数据
data_rows = []
current_meta = {}
header = None

for idx, row in df_raw.iterrows():
    # 去掉空值,得到有效字段列表
    parts = row.dropna().tolist()
    if parts[0] == 'DATE':
        current_meta['DATE'] = parts[1]
        current_meta['TIME'] = parts[3]
    elif parts[0] == 'K1':
        current_meta['K1'] = parts[1]
        current_meta['PICKER'] = parts[2]
    elif parts[0] == 'DATA':
        header = parts
    else:
        if header:
            row_dict = dict(zip(header, parts))
            row_dict.update(current_meta)
            data_rows.append(row_dict)

df = pd.DataFrame(data_rows)

最终效果

处理后的df会将每个数据行与对应的DATA表头匹配,同时包含每个数据块的日期、时间、K1等元数据,示例输出大致如下:

DATANOMINALACTUALTOLERANCEDEVIATIONDATETIMEK1PICKER
SIZE K38.0538.04720.05-0.0028yyyy-mm-ddxx:yyNaNNaN
POSN Y00.002500.0025yyyy-mm-ddxx:yyNaNNaN
SIZE K88.09890.20.0989yyyy-mm-ddxx:yy70PICKER
POSN Y0-0.02460-0.0246yyyy-mm-ddxx:yy70PICKER

内容的提问来源于stack exchange,提问作者Holmbrero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:33:16