2014-06-25 120 views
0

我有一个文件,其中每行包含以下内容: 文件的名称,列表的长度,实际列表。 这里是一个例子:从python中的文件读取列表

a.txt 3 [4,2,9] 
b.txt 5 [1,6,5,2,8] 
c.txt 7 [1,2,3,4,5,6,7] 

等等。 我已经设法读取一切,直到列表,但列表读取为字符串。例如,对于第一个,输出是'[4,','3,','4]',我想要一个正常的列表。 这是我到目前为止的代码,但它是从文件只是一个简单的阅读:

f = open('example.txt', 'r') 
for eachLine in f: 
    a = eachLine.strip().split() 
    l = a[2] 
print l 
f.close() 

我用l=a[2]但这并不存储我的整个列表,它只能存储从它的第一要素。

如何将文件中的列表存储到Python中的列表中?

+0

您需要评估列表,蟒蛇列表,您可以使用[ast.literal_eval(https://docs.python.org/2/library/ast。 html#ast.literal_eval) –

+0

如果你真的想简化和增加灵活性,你可以使用[pickle](https://docs.python.org/2/library/pickle.html)来序列化你的数据。然后加载你的数据就像'pickle.load(f)'一样简单。您需要做一些转换,并将所有数据保存为pickle而不是当前的格式。 – msvalkon

+0

列表元素之间是否有空格?试试'.split(maxsplit = 2)'。 – jonrsharpe

回答

2
with open('example.txt', 'r') as f: 
    for eachLine in f:           
     a = eachLine.strip().split(" ",2)       
     req_list = [int(x) for x in a[2].strip('[]').split(',')] 
     print req_list           

输出:无使用eval

[4, 2, 9] 
[1, 6, 5, 2, 8] 
[1, 2, 3, 4, 5, 6, 7] 
+0

这会工作,但'l = a [2]'不存储整个列表。我编辑了我的问题来包含这个事实。 – user1956190

+0

@ user1956190,我不明白。我已经测试过它并且可以工作 –

+0

赋值'l = a [2]'只返回列表中的第一个元素。例如'[4,'。它只能从列表中逐一读取元素。 – user1956190

-1

你可以使用eval:

eval('[4,3,4]') 

返回列表[4,3,4]

+4

这是不推荐,如果有的话,你可以使用[ast.literal_eval()](http://stackoverflow.com/a/15197698/1982962) –

0

你可以使用eval函数像这样:

with open('example.txt', 'r') as f: 
    for eachLine in f: 
     tokens = eachLine.strip().split() 
     theLen = int(tokens[0]) 
     theList = eval(tokens[1]) 

要小心使用eval然而。如果你从一个不受信任的源读取数据,他们可以通过传入任意Python代码的文件来做一些令人讨厌的事情。

如果可能的话,你应该使用像json这样的文件格式来读取/写入简单的数据结构到磁盘上,因为这些格式已经具有强大的de/serialization来防止这种攻击。

+1

同样杰夫答案eval不建议,因为它可以是不安全的外观[这里](http://stackoverflow.com/a/15197698/1982962) –

+1

当然它可能是不安全的,但有时这些东西存在于一个安全的环境中,使用eval是一个完全可行的选择。没有上下文的问题很难知道。理想情况下,你会使用json或其他已经存在的文件格式来解决这些问题。 – Hamish

+0

是的,但是由于缺乏详细信息,建议'eval'不是回答此问题的最佳方法。 –

1

解。

with open('input.txt', 'r') as f: 
    for eachLine in f: 
     a = eachLine.strip().split() 
     l = list(int(x) for x in a[2][1:-1].replace(',',"")) 
     print l 

输出

[4, 2, 9] 
[1, 6, 5, 2, 8] 
[1, 2, 3, 4, 5, 6, 7]