将包含 python 列表的文本文档读入 python 程序

Reading a text document containing python list into a python program

我有一个文本文件(dummy.txt),内容如下:

['abc',1,1,3,3,0,0]
['sdf',3,2,5,1,3,1]
['xyz',0,3,4,1,1,1]

我希望它出现在 python 的列表中,如下所示:

article1 = ['abc',1,1,3,3,0,0]
article2 = ['sdf',3,2,5,1,3,1]
article3 = ['xyz',0,3,4,1,1,1]

dummy.txt

中存在的行数必须创建多少篇文章

我正在尝试以下操作: 打开文件,用 '\n' 将其拆分并将其附加到 python 中的一个空列表,它有额外的引号和方括号,因此尝试使用 'ast.literal_eval' 但效果不佳。

my_list = []
fvt = open("dummy.txt","r")
for line in fvt.read():
    my_list.append(line.split('\n'))
    my_list = ast.literal_eval(my_list)

我还尝试使用替换手动删除额外的引号和额外的方括号,这也没有帮助我。非常感谢任何线索。

这应该有所帮助。

import ast

myLists = []
with open(filename) as infile:
    for line in infile:                         #Iterate Each line
        myLists.append(ast.literal_eval(line))  #Convert to python object and append.
print(myLists)  

输出:

[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]

fvt.read() 将生成整个文件字符串,这意味着 line 将包含单个字符串。所以这不会很好地工作,你还使用 literal_eval(..) 整个字符串列表,而不是单个字符串。

您可以通过遍历文件处理程序来获取结果,并且每次在单个 line:

上调用 literal_eval(..)
from ast import literal_eval

with open("dummy.txt","r") as f:
    my_list = [literal_eval(line) for line in f]

或使用 map:

from ast import literal_eval

with open("dummy.txt","r") as f:
    my_list = list(map(literal_eval, f))

然后我们得到:

>>> my_list
[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]

ast.literal_eval 是正确的做法。请注意,创建 variable number of variables,例如 article1article2,... 并不是一个好主意。如果您的名字有意义,请使用字典,否则使用列表。

正如 Willem 在 中提到的,fvt.read() 会将整个文件作为一个字符串提供给您。利用文件是 iterable line-by-line 的事实要容易得多。保留 for 循环,但去掉对 read.

的调用

此外,

my_list = ast.literal_eval(my_list)

是有问题的,因为 a) 您评估了错误的数据结构 - 您想要评估行, 而不是 您附加到的列表 my_list 和 b) 因为您重新分配名称 my_list,此时旧的 my_list 已消失。

考虑以下演示。 (将 fake_file 替换为您打开的实际文件。)

>>> from io import StringIO
>>> from ast import literal_eval
>>> 
>>> fake_file = StringIO('''['abc',1,1,3,3,0,0]
... ['sdf',3,2,5,1,3,1]
... ['xyz',0,3,4,1,1,1]''')
>>> result = [literal_eval(line) for line in fake_file]
>>> result
[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]

当然,你也可以用字典来保存求值行:

>>> result = {'article{}'.format(i):literal_eval(line) for i, line in enumerate(fake_file, 1)}
>>> result
{'article2': ['sdf', 3, 2, 5, 1, 3, 1], 'article1': ['abc', 1, 1, 3, 3, 0, 0], 'article3': ['xyz', 0, 3, 4, 1, 1, 1]}

现在你可以在哪里发布

>>> result['article2']
['sdf', 3, 2, 5, 1, 3, 1]

... 但由于这些名称不是很有意义,我只是选择列表,而不是您可以使用 012 索引的列表。 ..

当我这样做时:

import ast
x = '[ "A", 1]'
x = ast.literal_eval(x)
print(x)

我得到:

 ["A", 1]

所以,您的代码应该是:

for line in fvt.read():
    my_list.append(ast.literal_eval(line))

试试这个 split(不需要导入)(我推荐):

with open('dummy.txt','r') as f:
    l=[i[1:-1].strip().replace("'",'').split(',') for i in f]

现在:

print(l)

是:

[['abc', 1, 1, 3, 3, 0, 0], ['sdf', 3, 2, 5, 1, 3, 1], ['xyz', 0, 3, 4, 1, 1, 1]]

不出所料!!!