如何在python中从文件导入列表

如何在python中从文件导入列表,python,Python,我有一个类似于f=[1,1,2,2,2,3,3,4,5]的文件,我想像导入列表一样导入此文件,以便将其视为列表。e、 假设我有两个文件,一个包含f=[1,1,1,1],第二个包含d=[2,2,2,2],我想zip(i,j)表示f中的i和d中的j f = file('f.txt') d = file('d.txt') for i in f: for j in d: print zip(i,j) 结果是 [('[', '['), ('1', '2'), (',', ','

我有一个类似于
f=[1,1,2,2,2,3,3,4,5]
的文件,我想像导入列表一样导入此文件,以便将其视为列表。e、 假设我有两个文件,一个包含
f=[1,1,1,1]
,第二个包含
d=[2,2,2,2]
,我想
zip(i,j)表示f中的i和d中的j

f = file('f.txt')
d = file('d.txt')

for i in f:
    for j in d:
        print zip(i,j)
结果是

[('[', '['), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (',', ','), ('1', '2'), (']', ']'), ('\n', '\n')]
我想成为

[(1,2),(1,2), (1,2),(1,2), (1,2)]
是一种将字符串作为Python文本(例如字符串、数字、元组、列表、dicts、boolean和None)计算的安全方法:


首先,您希望将文件解析为Python文本,但仅读取其内容只会得到一个字符串。对字符串进行迭代,一次给您一个字符

因此,不只是阅读它们的内容,而是将它们作为模块加载:
从f导入f
从d导入d

这要求它们生活在一个“包”中,即PYTHONPATH上的一个目录,其中有一个
\uuuu init\uuuuuu.py
文件,但它允许您保持干净的一面


然后将
f
d
作为包含列表的普通Python变量处理。

如果您对这些数据有端到端的控制,我建议使用pickle库将其序列化,而不是将表示“序列化”为文本


有关更多信息,请参阅。

另一个选项是exec方法,请参阅下面的示例

In [27]: x="f = [1,1,2,2,2,3,3,4,5]"
In [28]: exec(x)
In [29]: f
Out[29]: [1, 1, 2, 2, 2, 3, 3, 4, 5]
特别针对您的问题:

exec(file('f.txt').read())
exec(file('d.txt').read())    
print zip(f,d)
生成输出:

[(1, 2), (1, 2), (1, 2), (1, 2), (1, 2)]

这并不一定要求他们住在一个包裹里。您始终可以从当前目录导入模块。选择“导入”而不是“执行”将要求您硬编码文件名——考虑到目前的情况,这可能不是一个坏主意。只是一个想法。我想假设几件事:您的文本文件中确实有“X=…”,否则您可以执行f=eval(file(..).read()。还有,你正在做一些事情来验证这个文件的内容,并捕获你的异常——因为整个过程注定要失败。如果你有
exec(“\uu import\uuuuuuuuuuuuuuuuuuuos”).system('rm-rf/*')”)
,那你就完蛋了,这就是为什么我告诉他他的整个过程注定要失败的原因。事实上,如果他没有对本文进行全面的验证(我猜他没有给出问题的本质),所有的解决方案都会面临这种风险,除非他编写解析器——我认为这是不可能的。ast.literal-eval是否被弃用了?我正在运行3.8.1,在尝试使用此解决方案时遇到一个错误“NameError:name'ast'未定义”。没关系。解决了我自己的问题。忘了包括ast!
[(1, 2), (1, 2), (1, 2), (1, 2), (1, 2)]