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

如何用Python Pandas提取TXT文件指定列并保存至新文件?

问题描述

我有一个名为sentences.txt的TXT文件,内容如下:

a01-000u-s00-00 0 ok 154 19 408 746 1661 89 A|MOVE|to|stop|Mr.|Gaitskell|from
a01-000u-s00-01 0 ok 156 19 395 932 1850 105 nominating|any|more|Labour|life|Peers

文件每行包含10列数据,我想用Pandas DataFrame提取第0列(文件名)和第9列的文本(需把|替换为空格)。我写了如下代码:

import pandas as pd

def load() -> pd.DataFrame:
    df = pd.read_csv('sentences.txt',sep=' ', header=None)
    data = []
    with open('sentences.txt') as infile:
        for line in infile:
            file_name, _, _, _, _, _, _, _, _, text = line.strip().split(' ')
            data.append((file_name, cl_txt(text)))

    df = pd.DataFrame(data, columns=['file_name', 'text'])
    df.rename(columns={0: 'file_name', 9: 'text'}, inplace=True)
    df['file_name'] = df['file_name'].apply(lambda x: x + '.jpg')
    df = df[['file_name', 'text']]
    return df

def cl_txt(input_text: str) -> str:
    text = input_text.replace('+', '-')
    text = input_text.replace('|', ' ')
    return text

load()

运行时出现错误:

ParserError: Error tokenizing data. C error: Expected 10 fields in line 4, saw 11

我期望输出的process.txt内容如下:

a01-000u-s00-00.jpg  A MOVE to stop Mr. Gaitskell from
a01-000u-s00-01.jpg  nominating any more Labour life Peers
问题分析与解决

错误原因

  1. 代码中多余的pd.read_csv调用会用空格分割每行,若文件存在连续空格,会被识别为多个分隔符,导致列数计算错误触发ParserError,且这行代码后续未被使用。
  2. cl_txt函数逻辑错误:先赋值替换+后的结果,紧接着又用原输入文本覆盖,导致+替换操作完全无效。
  3. 使用split(' ')分割时,若行内有连续空格会生成空字符串元素,导致解包时变量数量与元素数量不匹配。

修正后的代码

import pandas as pd

def cl_txt(input_text: str) -> str:
    # 先替换+为-,再替换|为空格
    text = input_text.replace('+', '-')
    text = text.replace('|', ' ')
    return text

def load() -> pd.DataFrame:
    data = []
    with open('sentences.txt', 'r', encoding='utf-8') as infile:
        for line in infile:
            # 用无参split()自动处理任意数量的空白分隔符
            parts = line.strip().split()
            if len(parts) == 10:
                file_name = parts[0]
                text = parts[9]
                data.append((file_name + '.jpg', cl_txt(text)))
    
    df = pd.DataFrame(data, columns=['file_name', 'text'])
    # 生成目标输出文件
    df.to_csv('process.txt', sep='  ', index=False, header=False, line_terminator='\n')
    return df

load()

关键优化点

  • 移除多余的pd.read_csv调用,避免列数不匹配错误。
  • 用无参split()替代split(' '),自动处理任意空白分隔符,确保每行分割后得到10个有效元素。
  • 修复cl_txt函数的赋值逻辑,让两个替换操作均生效。
  • 直接在数据收集阶段添加.jpg后缀,减少不必要的apply操作。
  • 添加to_csv语句,直接生成符合要求的process.txt文件,指定双空格分隔、无索引表头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:30:58