将大字符串更改为列表

时间:2018-02-06 16:57:43

标签: python python-3.x numpy

我目前有一个大文件(~65mb),里面有一个像这样的列表;

[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]]...]

Python认为上面是一个字符串,我试过eval()ast.literal_eval()这两个都会导致内存错误。

然后我把它变成了一个字典{mlst: list()},它可以更快地加载它,但python仍然把它看作一个字符串。

有没有一种简单的方法让python识别字符串是一个列表?或者是为python构建JSON文件还是更容易阅读的格式?

谢谢!

1 个答案:

答案 0 :(得分:3)

如果我创建一个文件:

x=[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]]]

即附加了简单赋值的字符串。

In [1]: import stack48648178
In [3]: stack48648178.x
Out[3]: 
[[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
 [[0, 0, 1], [0, 0, 2], [0, 0, 3]],
 [[0, 0, 1], [0, 0, 2], [0, 0, 3]]]

实际上,这会对文件文本执行eval

我不打算生成并测试大文件。但是如果你得到一个内存错误,那么结果列表可能对你的RAM来说太大了。使用这种嵌套程度,列表结构(包含所有指针)可能会变得非常大。这个小的数字有唯一的ID,但你有几层指针可以到达每一个。

可能有一些中间列表涉及解析字符串以提高内存需求,但这很难追踪。

numpy数组的内存要求会更少,但你仍然需要通过列表解析来创建它:

In [5]: X = np.array(stack48648178.x)
In [6]: X.shape
Out[6]: (3, 3, 3)
In [7]: np.size(X)
Out[7]: 27

使用字符串memory:

In [8]: txt='[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,
   ...: 2],[0,0,3]]]'
In [9]: txt
Out[9]: '[[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]],[[0,0,1],[0,0,2],[0,0,3]]]'
In [10]: eval(txt)
Out[10]: 
[[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
 [[0, 0, 1], [0, 0, 2], [0, 0, 3]],
 [[0, 0, 1], [0, 0, 2], [0, 0, 3]]]
In [11]: import json
In [12]: json.loads(txt)
Out[12]: 
[[[0, 0, 1], [0, 0, 2], [0, 0, 3]],
 [[0, 0, 1], [0, 0, 2], [0, 0, 3]],
 [[0, 0, 1], [0, 0, 2], [0, 0, 3]]]

evaljson执行相同的操作,从而生成相同的嵌套列表。我再说不出他们在处理过程中使用了多少内存,但我怀疑它的内存大致相同。