保存并从Python读取Python字典

问题描述:

我想执行一个简单的操作,将一个Python字典存储到一个csv文件中,然后以字典的形式从文件中读取它。保存并从Python读取Python字典

我的字典中的字符串映射到numpy的阵列的列表,例如:

d = {'x': [array([2, 3, 4]), array([5, 6, 7])], 'y': [array([1, 2, 3]), array([4, 5, 6])] 

所以我想保存这本词典为CSV,然后重新创建该文件的字典在不同的程序。

我试过使用python的csv模块将字典写入csv文件,但无法正确存储多维numpy数组列表。当我使用模块读取它时,它会读回csv文件中的空白行。

我也尝试使用pandas,但无法弄清楚如何使用read_csv()方法从字典中读取numpy数组列表。

+2

请勿使用csv。使用pickle(如果你的其他程序也是一个python程序;否则:使用JSON或类似的东西,通过使用二进制类型存储更高效,例如msgpack)! *编辑:*如果它只是numpy数组列表,请阅读numpys文档,因为有特殊的存储方法,如[savez](https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez .html) – sascha

+1

@sascha是对的。看看https://wiki.python.org/moin/UsingPickle –

+0

pickle能够按原样加载整个字典吗?一些numpy值是更复杂的浮点数,我只是为了简单起见而使用了整数。 – user3543300

In [610]: d = {'x': [np.array([2, 3, 4]), np.array([5, 6, 7])], 'y': [np.array(
    ...: [1, 2, 3]), np.array([4, 5, 6])]} 
In [611]: d 
Out[611]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 

In [613]: np.save('test.npy',d) 
In [614]: np.load('test.npy') 
Out[614]: array({'x': [array([2, 3, 4]), array([5, 6, 7])], 'y': [array([1, 2, 3]), array([4, 5, 6])]}, dtype=object) 

所以调用字典save,它包装在一个对象类型阵列的字典,然后将保存。对象数组的元素将使用各自的pickle方法保存。所以它腌制一本字典,以及字典中的列表。最后,列表中的阵列采用np.save版本进行腌制。大量的嵌套。但它的工作。

而且item可以用于拉字典出对象阵列的:

In [616]: dd=np.load('test.npy').item() 
In [617]: dd 
Out[617]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 

,并直接使用pickle

In [626]: pickle.dump(d, open('test.pkl','wb')) 
In [627]: np.load('test.pkl') 
Out[627]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 
In [629]: pickle.load(open('test.pkl','rb')) 
Out[629]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 

若要写入从该字典我创建一个csv结构化数组,字段名为'x'和'y'。但我想我必须连接数组,所以我可以生成一个1d数组。然后,CSV看起来是这样的:

x y 
2 1 
3 4 
.... 

或者,如果子阵都是一样的长度,我也许可以产生

x y 
2 5 1 4 
3 6 2 5 
... 

在任何如果你还是想要去的CSV路线,你需要决定如何将这些值表示为简单的行列。

+0

是第一个效率最高的?我只需要存储和重新加载字典,它不一定是一个csv – user3543300