我应该如何读/写包含大数组的数据结构?

时间:2016-10-14 08:01:53

标签: python arrays dictionary file-io

我从服务器获取大量数据。我将它存储在字典和多维数组的组合中,它将用于简单的绘图。它看起来像:

>> print(data)
{'intensity_b2': [array([  1.46562588e+09,   1.46562588e+09,   1.46562588e+09, ...,
     1.46566369e+09,   1.46566369e+09,   1.46566369e+09]), array([ 0.,  0.,  0., ...,  0.,  0.,  0.])]}
>> print(len(data['intensity_b2'][0]))
37071

为避免每次运行脚本时都提取数据,我想将此数据结构保存到文件中。我尝试将数据存储为

with open("data.dat", 'w') as f:
    f.write(str(data))

并用

阅读
with open(data_store, 'r') as f:
    data = ast.literal_eval(f.read())
建议here

。但是,我收到错误

  

ValueError:格式错误的节点或字符串:< _ast.Call对象位于0x108fce5f8>

我怀疑这是因为数据与第一个打印输出中显示的...一起存储(即上面的第一个print(data)字面意思是数据在文件中的外观) 。如何将带有大数组的字典写入文件并随后读取?

2 个答案:

答案 0 :(得分:1)

您的问题是str不适合序列化数据。通常,对象将具有字符串表示,以使人们理解它们是什么。对于原始对象,它甚至可以eval获取一个等效对象的格式,但通常情况并非如此。

您需要决定如何序列化数据。你可以使用类似JSON之类的东西,但是你需要弄清楚如何从原始数据类型转换对象,我认为你已经很清楚你不使用原始数据类型了。 / p>

您可能希望使用pickle创建数据的序列化版本,稍后您可以将其取消,并获得相同的数据类型。

答案 1 :(得分:1)

您可以使用pickle正确处理序列化:

In [23]: a
Out[23]: 
{'intensity_b2': [array('f', [1465625856.0, 1465625856.0, 1465625856.0]),
  array('f', [1465663744.0, 1465663744.0, 1465663744.0])]}

In [24]: pickle.dump(a, open('foo.p', 'wb'))

In [25]: aa = pickle.load(open('foo.p', 'rb'))

In [26]: aa
Out[26]: 
{'intensity_b2': [array('f', [1465625856.0, 1465625856.0, 1465625856.0]),
  array('f', [1465663744.0, 1465663744.0, 1465663744.0])]}

这完全符合您的要求:将数据结构保存到文件中,然后从文件中读取。

然而,看起来你在这里重新发明轮子。您可能需要查看numpypandas