2013-03-24 109 views
5

我以前创建了list并将其保存到文件'mylist.txt'。但是,当我读取它时,它是一个字符串,这意味着我无法按照我喜欢的方式访问每个元素。我一直在努力寻找解决方法,但无济于事。Python - 从文件中读入先前的'list'变量

在文本文件中,该列表是一条线,看起来是这样的:

[(['000', '001', '002'], ('010', '011', '012')), (['100', '101', '102'], ('110', '111', '112'))] 

因此,如果这个名单等于mylist,我可以做

>>> print mylist[0] 
(['000', '001', '002'], ('010', '011', '012')) 
>>> print mylist[0][0] 
['000', '001', '002'] 
>>> print mylist[0][0][2] 
002 

以上对我有用,但在列表中阅读有以下效果:

>>>myreadlist=open("mylist.txt",'r').read() 
>>>myreadlist 
"[(['000', '001', '002'], ('010', '011', '012')), (['100', '101', '102'], ('110', '111', '112'))]" 
>>>myreadlist[0] 
'[' 
>>>print myreadlist[0] 
[ 
>>>myreadlist[:15] 
"[(['000', '001'" 

等 我知道mylist的格式不好,但它适用于我想要的,它需要很长时间来生成它。我试过只是将列表复制粘贴到python,如mylist = <paste>,但是列表太长了,我得到一个内存错误。

是否有读取文件并将其用作list的方法,这样我就可以像正常一样访问每个元素(即如上面的第一个打印语句所示)?

非常感谢

回答

13

将字符串传递给ast.literal_eval。它将安全地将字符串解析为适当的结构:

>>> import ast 
>>> with open("file.txt", 'r') as f: 
     data = ast.literal_eval(f.read()) 
>>> # You're done! 
+0

这工作完美!非常感谢你,这让我非常头疼。考虑这个“解决”! – 2013-03-24 05:58:21

0

它是否必须是应用程序中的纯文本文件?假设你已经将它正确地格式化为一个Python列表,你可以把它变成Python代码而不是文本。重命名文件mylist.py并在列表的前面添加像mylist = [xxx]这样的任务。

在需要访问此列表的Python脚本中,您可以导入它,如from .mylist import mylist,这将允许您完成您的工作(例如mylist[0]等)。

上述导入假定mylist.py和您的Python脚本位于同一个模块中(同一个目录中有一个__init__.py文件)。如果您不清楚(看看Python modules),只需将整个列表复制到与您的脚本相同的文件中,然后在同一文件的顶部进行分配。

+0

感谢您的评论和信息。它不一定是一个.txt文件,但是我发现@icktoofay的回应最有用,并将在这个特定的实例中使用该方法。 – 2013-03-24 06:08:08