Python: 读取 .txt 文件而不将其内容放入字符串中

Python: Read .txt file without putting its content in strings

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

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

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

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

是什么导致模型的训练数据无效。

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

//编辑:

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

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

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

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

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

您需要将字符串解释为 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 应该是所有数据对象的元组。

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

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() + ']')

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