Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:读取.txt文件而不将其内容放入字符串中_Python_Readlines - Fatal编程技术网

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

Python:读取.txt文件而不将其内容放入字符串中,python,readlines,Python,Readlines,我创建了一个.txt文件,其中包含模型的训练数据。训练样本具有如下特定结构: ("sample sentence", {"entities": [ ]}) 我需要在python中列出600个。但是,当我使用file.readlines()等执行“普通”python读取时,我会将所有示例作为字符串导入,这些字符串基本上如下所示: '("sample sentence",' '{"entities": [ ]})' 是什么使训练数据对模型无效 所以我的问题是,我如何告诉python在不使用任何字

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

("sample sentence",
{"entities": [ ]})
我需要在python中列出600个。但是,当我使用
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对象。 在没有更多关于文件结构的知识的情况下,我将假设它任意断开行,并且数据对象之间没有任何分隔符,除了断开行

如果是这种情况,则此代码应适用于:

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\u DATA
应该是所有数据对象的元组。它适用于您的示例。试试看

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


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

不幸的是,这在以下第一个逗号之后出现了
意外的EOF
错误:(“示例语句”,我也尝试了您的编辑代码示例,但它仍然给我一个错误。这一次,在第二个示例之前,出现了一个
无效语法
错误。不确定示例之间的换行符是否对您的解决方案是一个问题。您是否使用了最新的编辑?删除换行符的编辑?不,我没有看到您的编辑。它现在可以在没有er的情况下工作ror但它将所有内容放在圆括号内。你知道如何避免吗?我感谢你的帮助!我认为spaCy模型的训练过程包括使用“numpy.random.shuffle”函数对训练数据进行洗牌,因此我觉得训练数据将在原地更改,因此它必须是一个列表。对不起,我不告诉你我在遇到错误时才知道这一点。但在大多数情况下,我想你的解决方案也应该可以。请为输入文件添加问题示例。而不仅仅是一个对象。删除换行符后,不必添加换行括号。这取决于你是否需要列表或元组,但由于唯一的区别是列表/元组的易变性,而且用户不太可能添加项,因此它是可互换的。我尝试了第一种解决方案,效果非常好,谢谢!
from ast import literal_eval
with open(file_name, 'r') as f:
  TRAIN_DATA = literal_eval('[' + f.read() + ']')