【问题标题】:Text file to CSV with a special condition on the text [closed]文本文件到 CSV,文本上有特殊条件[关闭]
【发布时间】:2020-08-03 08:45:14
【问题描述】:

我有一个像这样的文本文件

******************** extractive sentences ********************

[gold] This is gold sentence

[raw ] This is raw sentence

[rev ] This is rev sentence

[ref ] This is ref sentence

******************** extractive sentences ********************

[gold] This is gold sentence

[raw ] This is raw sentence

[rev ] This is rev sentence

[ref ] This is ref sentence

我想创建一个 CSV,这样所有的 [gold] 句子都会出现 在第一列中,对应的[rev]句子在第二列中

我尝试使用pd.read_csv 读取文件,但由于句子中可能包含“,”而出现错误,并且出现如下错误:

'Expected 1 fields in line 11, saw 2'

谁能帮我解决这个问题?

【问题讨论】:

  • 为什么不用原始 python 打开:打开
  • 是的,我可以这样做,但是在那之后呢?
  • 你可以将它们排列成标准的csv或tsv文件,然后用pandas打开
  • 作为普通文件读取,拆分为行列表 - 您甚至可以将此列表转换为 dataframe 一列 - 然后您可以将带有 gold 的行过滤到新 @987654328 中的新列@,与rawrevref 相同
  • 始终将代码、数据和错误消息作为文本而不是图像。对于图像上的数据,我们无法使用它来创建示例代码 - 这样您就不会得到答案。

标签: python csv text


【解决方案1】:

如果 .txt 文件中的数据结构与原始问题中所述一致,则以下解决方案将从所有“[gold]”和“[rev ]”行中提取内容,并将其中的每一对提取到 .带有适当标题的 csv 文件。

它通过以下方式实现:

  • input.txt 中的每一行读入字符串列表
  • 使用re 过滤此列表以查找以[gold] 开头的行,将前导[gold] 和尾随换行符(\n) 剥离到一个新列表中,其中包含顺序中所有“[gold]”行的内容他们出现在input.txt
  • 对以[rev ] 开头的行重复上述步骤,将它们过滤到自己的列表中
  • 使用上面生成的列表创建pandas.DataFrame 以填充相应标题下的列(goldrev) - gold 是第一列,rev 第二列根据您的原始问题
  • 通过pandas.DataFrame.to_csv()DataFrame 写入output.csv
import pandas as pd
import re

with open('input.txt', 'r') as f:
    lines = f.readlines()
    
gold = [ re.sub(r'(\[gold\]\s)|\n', '', l) for l in lines if re.search(r'^\[gold\]', l) ]

rev = [ re.sub(r'(\[rev\s\]\s)|\n', '', l) for l in lines if re.search(r'^\[rev\s\]', l) ]

data = {'gold': gold, 'rev': rev}

df = pd.DataFrame(data)

df.to_csv('output.csv', index=False)

重要注意事项

上述解决方案假设每个“[gold]”都会有一个对应的“[rev ]”——如您提供的示例所示。

如果有“[gold]”行没有对应的“[rev ]”行 - 反之亦然 - 在您正在阅读的 .txt 文件的每个“部分”中,行的排序/配对将不正确。

但是,如果您的 .txt 文件中的数据在按照原始示例的统一结构方面可靠地保持一致,那么这将不是问题。

【讨论】:

  • 谢谢,它成功了,因为这两个考虑都得到了满足
猜你喜欢
  • 2020-03-24
  • 2021-06-27
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多