从一个程序中我生成一堆数据并将其存储在一个文件中。文件内容的一个例子是
[[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 :(得分: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 :(得分:4)
ast
模块提供literal_eval(repr)
函数,安全评估任何python 文字:
>>> 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.loads
明显快于ast.literal_eval
,尽管它们解析了在处理简单列表文字时恰好相同的不同事物。
答案 2 :(得分:1)
也许eval
会帮助你:
In [1]: s = '[[1,2,3],[4,5,6]]'
In [2]: eval(s)
Out[2]: [[1, 2, 3], [4, 5, 6]]