2014-06-25 233 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]