【问题标题】:Python: Read .txt file without putting its content in stringsPython:读取 .txt 文件而不将其内容放在字符串中
【发布时间】:2018-07-14 10:06:41
【问题描述】:

我创建了一个包含模型训练数据的 .txt 文件。训练样本具有一定的结构,如下所示:

("sample sentence",
{"entities": [ ]})

我有 600 个需要放入 python 列表中。但是,当我使用file.readlines() 等进行“正常”python 读取时,我将所有示例导入为基本上如下的字符串:

'("sample sentence",'
'{"entities": [ ]})'

是什么使训练数据对模型无效。

所以我的问题是如何告诉 python 在没有任何字符串格式的情况下读取 .txt 文件,而是按原样读取它?

//编辑:

.txt 是一个包含训练数据的文件,该文件适合遵循 NER 注释方案的 spaCy 模型的训练过程。 spaCy 文档页面中带有 NER 注释方案的训练数据示例:

TRAIN_DATA = [
     ("Uber blew through $1 million a week", {'entities': [(0, 4, 'ORG')]}),
     ("Google rebrands its business apps", {'entities': [(0, 6, "ORG")]})]

我的 .txt 文件看起来完全像这样,除了在 .txt 文件的开头和结尾没有 [ ] 并且在其间换行。所以这个例子在我的 .txt 文件中看起来像这样:

("Uber blew through $1 million a week", 
{'entities': [(0, 4, 'ORG')]}),

("Google rebrands its business apps", 
{'entities': [(0, 6, "ORG")]})

【问题讨论】:

  • 请在您的问题示例中添加输入文件。不只是一个对象。

标签: python readlines


【解决方案1】:

我想出了以下内容。它适用于您的示例。试试看。

from ast import literal_eval
with open(file_name, 'r') as f:
  TRAIN_DATA = literal_eval('[' + ''.join(f.readlines()) + ']')

from ast import literal_eval
with open(file_name, 'r') as f:
  TRAIN_DATA = literal_eval('[' + f.read() + ']')

这会读取整个文件并在评估之前添加缺少的方括号。

【讨论】:

  • 删除换行符后,就不需要添加换行括号了。
  • 取决于你需要列表还是元组
  • 是的,但由于唯一的区别是列表/元组的可变性,并且由于用户不太可能添加项目,因此它可以互换。
  • 我尝试了第一个解决方案,效果非常好,谢谢!
【解决方案2】:

您需要将字符串解释为 Python 对象。 如果没有更多关于文件结构的知识,我将假设它任意换行,并且数据对象之间除了换行符之外没有任何分隔符。

如果是这种情况,这段代码应该可以工作:

from ast import literal_eval
def iterate_objects(filename):
    cur_data = ""
    with open(filename, 'r') as f:
        for l in f.readlines():
            cur_data += l
            try:
                yield literal_eval(cur_data)
            except:
                continue

TRAIN_DATA = list(iterate_objects(your_filename))

它试图解释到目前为止累积的行,直到它成功,然后它产生对象并继续。

编辑

鉴于新的 .txt 文件示例,一个更简单的解决方案将起作用:

from ast import literal_eval
with open(filename, 'r') as f:
    TRAIN_DATA = list(literal_eval(f.read().replace('\n','')))

根据给定的 .txt 示例,输出 TRAIN_DATA 应该是所有数据对象的元组。

【讨论】:

  • 不幸的是,这给了我一个unexpected EOF 错误之后的第一个逗号: ("sample sentence",
  • 我也尝试了您的编辑代码示例,但它仍然给我一个错误。这次在第二个样本之前出现invalid syntax 错误。不确定样本之间的换行是否可能是您的解决方案的问题
  • 你用过最新的编辑吗?删除换行符的那个?
  • 不,我没有看到您的编辑。它现在可以正常工作,但会将所有内容放在圆括号中。你知道如何避免这种情况吗?感谢您的帮助!
  • 好吧,我认为 spaCy 模型的训练过程包括使用 'numpy.random.shuffle' 函数对训练数据进行混洗,因此我觉得训练数据会就地改变,因此它有成为一个列表。对不起,没有提前告诉你,因为我遇到错误时才知道这一点。但在大多数情况下,我猜你的解决方案也应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多