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

时间:2018-02-04 11:23:12

标签: python readlines

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

<template>
        <div ref="cool">COOL!</div>
        <div>I am new</div>
</template>

我有600个我需要放在python列表中的那些。但是,当我使用("sample sentence", {"entities": [ ]}) 等进行“正常”python读取时,我将所有示例导入为基本上如下的字符串:

file.readlines()

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

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

//编辑:

.txt是一个文件,其培训数据符合NER注释方案之后的spaCy模型的培训过程。使用spaCy文档页面中的NER注释方案的训练数据示例:

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

我的.txt文件看起来与此类似,只是在.txt文件的开头和末尾没有TRAIN_DATA = [ ("Uber blew through $1 million a week", {'entities': [(0, 4, 'ORG')]}), ("Google rebrands its business apps", {'entities': [(0, 6, "ORG")]})] ,并且两者之间有换行符。所以这个例子在我的.txt文件中看起来像这样:

[ ]

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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