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

如何解决管道符分隔CSV字段内带管道符导致pandas读取报错问题

管道符分隔CSV内嵌分隔符的读取解决方案

该问题的核心是文本字段未被转义或引号包裹,导致pandas无法区分内容中的|和字段分隔符,从而抛出字段数不匹配的错误。可根据你的文件特征选择以下方案:

  • 方案1:已知文本字段有固定格式包裹时优先使用(如你示例中的<strong>标签),先预处理替换内嵌管道符
    先通过正则匹配特定格式包裹的内容,将其中的半角管道符替换为不会冲突的字符(如全角管道符|),读取完成后可按需替换回原字符,代码示例:

    import re
    import pandas as pd
    
    def preprocess_file(input_path, output_path):
        with open(input_path, 'r', encoding='utf-8') as f:
            content = f.read()
        # 替换<strong>标签内的半角管道符为全角
        processed_content = re.sub(r'(<strong>.*?)\|(.*?</strong>)', r'\1|\2', content)
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(processed_content)
    
    # 预处理文件
    preprocess_file('你的原始文件路径.csv', '预处理后文件.csv')
    # 直接读取处理后的文件
    df = pd.read_csv('预处理后文件.csv', sep='|')
    
  • 方案2:已知固定字段数、且只有中间文本字段存在内嵌分隔符时使用,自定义行解析逻辑
    你当前文件的预期字段数为28,通常数值、日期类的首尾字段不会存在用户输入的分隔符,仅中间文本字段会有内嵌|,可以逐行分割后合并多余的部分到对应文本字段,代码示例:

    import pandas as pd
    
    EXPECTED_FIELDS = 28
    # 按你的实际字段结构调整,假设第3个字段(索引从0开始计数)是存在内嵌分隔符的文本字段
    TEXT_FIELD_INDEX = 2
    # 假设除文本字段外,末尾还有N个无内嵌分隔符的字段,比如示例中的末尾还有2个字段(31、24.06.2021)
    TAIL_FIELDS_COUNT = 2
    
    parsed_rows = []
    with open('你的原始文件路径.csv', 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            parts = line.split('|')
            if len(parts) == EXPECTED_FIELDS:
                parsed_rows.append(parts)
                continue
            # 合并文本字段位置到倒数TAIL_FIELDS_COUNT之前的所有片段
            merged_text = '|'.join(parts[TEXT_FIELD_INDEX: -TAIL_FIELDS_COUNT])
            new_row = parts[:TEXT_FIELD_INDEX] + [merged_text] + parts[-TAIL_FIELDS_COUNT:]
            parsed_rows.append(new_row)
    
    # 转换为DataFrame,如有表头可将第一行设为columns
    df = pd.DataFrame(parsed_rows[1:], columns=parsed_rows[0])
    
  • 方案3:使用pandas自带的坏行处理逻辑(需pandas 1.3及以上版本)
    直接通过on_bad_lines参数传入自定义处理函数,无需单独预处理文件:

    import pandas as pd
    
    def fix_bad_line(parts):
        # parts是当前行按|分割后的列表,按你的字段结构合并多余片段
        merged_text = '|'.join(parts[2:-2])
        return parts[:2] + [merged_text] + parts[-2:]
    
    df = pd.read_csv('你的原始文件路径.csv', sep='|', on_bad_lines=fix_bad_line)
    

注意:所有代码中的索引、字段数参数都需要根据你实际的CSV字段结构调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:09:00