字符串到数字数组

时间:2013-11-28 15:24:58

标签: python arrays string numpy eval

从一个程序中我生成一堆数据并将其存储在一个文件中。文件内容的一个例子是

[[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]]。我希望这个字符串再次成为一个数字数组。只是使用相同的分隔符等。我该怎么做?

3 个答案:

答案 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]]