2016-11-11 105 views
0

我想執行一個簡單的操作,將一個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

回答

2
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