2013-11-28 41 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显著快,虽然他们解析不同的事情,只有在处理简单列表文字。