2012-12-21 86 views
4

我想通過從文本文件中讀取它來構建列表或列表的列表。如何通過從文件中讀取來構建Python數據結構

例如,我有一個文件「mylist.txt」的說法

mylist = [ 
1, 
2, 
3, 
4] 

myotherlist = [ 
[1, 3, 4, 5], 
[3, 5, 3, 6] 
] 

我想讀的文本文件,然後用在我的Python腳本。

這可能嗎? 我只是在python語法中使用上面的例子。 我的目標是避免自己編寫解析邏輯。 XML似乎對我的目的來說太複雜了。

謝謝。

+0

文件是否有不可以人工編輯和/或人類可讀? – Wessie

+0

是的。它需要是可編輯和可讀的。 – michael

回答

2

如果是列表列表,那麼您應該直接在mylists.txt文件中定義它。

例如

MYLISTS = [ 
    [1, 2, 3], 
    [2, 3, 4], 
    ... 
] 

並將mylists.txt重命名爲mylists.py。

然後,在同一目錄下另一個Python腳本,你可以做

import mylists 
for sublist in mylists.MYLIST: 
    for elem in sublist: 
     .... 

這需要您進行任何解析代碼,和Python的「數據」文件是很容易的手工編輯,太。

+0

在選項文件的情況下,這通常被證明是一個好方法。 – acjay

4

如果我有以下數據文件(data.txt中): -

[1,2,3,4] 

那麼這個代碼將讀入一個列表。

from ast import literal_eval 

with open('data.txt') as fsock: 
    mylist = literal_eval(fsock.read()) 

這也適用於其他數據類型,例如,字典。有關更多詳細信息,請參閱literal_eval文檔。

1

如果你有在[1, 2, 3, 4]形式的東西,在這種情況下,你可以使用ast

In [1]: import ast 

In [2]: with open('lists.txt', 'rb') as f: 
    ...:  lists = f.readlines() 
    ...:  
    ...:  

In [3]: list_container = [ast.literal_eval(line.strip()) for line in lists] 

In [4]: list_container 
Out[4]: [[1, 2, 3], [[1, 2, 3], [4, 5, 6]]] 

在這種情況下,lists.txt是這樣的:

[1, 2, 3] 
[[1, 2, 3], [4, 5, 6]] 

但是,如果你的文件看起來與上述狀態完全相同,您可以使用exec,但應始終謹慎使用execeval之類的內容:

In [2]: with open('test.txt', 'rb') as f: 
    ...:  contents = f.read() 
    ...:  
    ...:  

In [3]: exec(contents) 

In [4]: mylist 
Out[4]: [1, 2, 3, 4] 

In [5]: myotherlist 
Out[5]: [[1, 3, 4, 5], [3, 5, 3, 6]] 

In [6]: print contents 
mylist = [ 
1, 
2, 
3, 
4] 

myotherlist = [ 
[1, 3, 4, 5], 
[3, 5, 3, 6] 
] 
1

由於您似乎暗示將列表存儲爲文件然後將其讀回,草莓的ast示例可能是最好的。但是如果你不熟悉它,我還會拋出pickle方法,這是一個二進制序列化。它會產生更小的文件和更快的讀取/寫入時間,代價是Python以外的可讀性和可移植性。

這樣寫:

import pickle # or cPickle 

myList = [1, 2, 3, 4] 

with open('data.txt', 'w') as f: 
    pickle.dump(myList, f) 

閱讀:

import pickle 

with open('data.txt', 'w') as f: 
    myList = pickle.load(f) 
+0

我的文件包含多個數據結構。那我怎麼用'pickle'? – michael

+0

您可以創建多個泡菜,也可以將所有數據結構按照某種結構(如元組,列表,字典或對象)捆綁在一起,具體取決於您的應用程序的適合程度。 – acjay