2013-11-28 70 views
1

從一個程序產生一堆數據,它存儲在一個文件中。文件內容的一個示例是字符串到數字數組

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

正如您所看到的,數據具有數組的確切形式。後來在另一個程序中,我想讀取數據並使用它。我使用

text_file = open('DataFile.txt') 
lines = text_file.readlines() #We have only 1 line but this doesn't matter 

可變lines是1個元件,其是字符串[[1, 2, 3], [4, 5, 6]]的陣列。我想這個字符串再次是一個數字數組。只需使用相同的分隔符等。我該怎麼做?

+0

'import ast; ast.literal_eval(the_text)' – Bakuriu

+0

是的,謝謝!這樣可行。不幸的是,我只能接受一個答案,因爲一切正確,我會接受第一個發表的。無論如何感謝:) – PepeToro

回答

4

您可以使用ast.literal_eval

>>> from ast import literal_eval 
>>> mystr = '[[1, 2, 3], [4, 5, 6]]' 
>>> x = literal_eval(mystr) 
>>> x 
[[1, 2, 3], [4, 5, 6]] 
>>> type(x) 
<type 'list'> 
>>> 
1

也許eval幫助你:

In [1]: s = '[[1,2,3],[4,5,6]]' 

In [2]: eval(s) 
Out[2]: [[1, 2, 3], [4, 5, 6]] 
+0

'eval'是不安全的。如果有人把'__import __(「subprocess」),Popen(「rm -rf」,shell = True)'作爲文件的第一行呢? (答案 - 您的硬盤將被擦除)。 – rlms

4

ast模塊提供了一個literal_eval(repr)功能安全評估任何蟒蛇文字

>>> import ast 
>>> ast.literal_eval("[[1,2,3,4], [5,6,7,8]]") 
[[1, 2, 3, 4], [5, 6, 7, 8]] 
>>> ast.literal_eval("19e6") 
19000000.0 

或者,你可以使用json.loads

>>> json.loads("[[1,2,3,4,5], [6,7,8,9]]") 
[[1, 2, 3, 4, 5], [6, 7, 8, 9]] 

json解決方案是相當更快literal_eval

In [1]: import ast, json 

In [2]: %timeit ast.literal_eval("[[1,2,3,4], [5,6,7,8]]") 
10000 loops, best of 3: 33.5 us per loop 

In [3]: %timeit json.loads("[[1,2,3,4], [5,6,7,8]]") 
100000 loops, best of 3: 4.16 us per loop 

In [4]: 33.5/4.16 
Out[4]: 8.052884615384615 
In [5]: big_list_text = '[{}]'.format(','.join(["[1,2,3,4]"] * 1000)) 

In [6]: %timeit ast.literal_eval(big_list_text) 
100 loops, best of 3: 14.6 ms per loop 

In [7]: %timeit json.loads(big_list_text) 
1000 loops, best of 3: 485 us per loop 

In [8]: 14600/485 
Out[8]: 30.103092783505154 

正如你可以看到json.loadsast.literal_eval顯著快,雖然他們解析不同的事情,只有在處理簡單列表文字。