如何用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
问题分析与解决
错误原因
- 代码中多余的
pd.read_csv调用会用空格分割每行,若文件存在连续空格,会被识别为多个分隔符,导致列数计算错误触发ParserError,且这行代码后续未被使用。 cl_txt函数逻辑错误:先赋值替换+后的结果,紧接着又用原输入文本覆盖,导致+替换操作完全无效。- 使用
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
相关产品推荐
相关产品推荐

