将包含 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,例如 article1
、article2
,... 并不是一个好主意。如果您的名字有意义,请使用字典,否则使用列表。
正如 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]
... 但由于这些名称不是很有意义,我只是选择列表,而不是您可以使用 0
、1
、2
索引的列表。 ..
当我这样做时:
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]]
不出所料!!!
我有一个文本文件(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,例如 article1
、article2
,... 并不是一个好主意。如果您的名字有意义,请使用字典,否则使用列表。
正如 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]
... 但由于这些名称不是很有意义,我只是选择列表,而不是您可以使用 0
、1
、2
索引的列表。 ..
当我这样做时:
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]]
不出所料!!!