在CSV中保存并读取Python字典

在CSV中保存并读取Python字典,python,csv,pandas,numpy,dictionary,Python,Csv,Pandas,Numpy,Dictionary,我想执行一个简单的操作,将python字典存储到csv文件中,然后将其作为字典从文件中读取 My dictionary将字符串映射到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

我想执行一个简单的操作,将python字典存储到csv文件中,然后将其作为字典从文件中读取

My dictionary将字符串映射到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\u csv()
方法从字典中读取numpy数组列表

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方法保存。所以它会对字典和字典中的列表进行pickle。最后,列表中的数组用
np.save的一个版本进行了pickle处理。大量筑巢。但它是有效的

可用于将字典从对象数组中拉出:

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”的结构化数组。但是我想我必须连接数组,这样我才能生成一个一维数组。然后,csv将类似于:

x    y
2    1
3    4
....
或者,如果子阵列的长度都相同,我可能能够生成

x    y
2 5  1 4
3 6  2 5
...
在任何情况下,如果您仍然希望使用csv路径,则需要决定如何将值表示为简单的列行

因此,在字典上调用
save
,它将字典包装在一个对象类型数组中,然后保存它。对象数组的元素使用各自的pickle方法保存。所以它会对字典和字典中的列表进行pickle。最后,列表中的数组用
np.save的一个版本进行了pickle处理。大量筑巢。但它是有效的

可用于将字典从对象数组中拉出:

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”的结构化数组。但是我想我必须连接数组,这样我才能生成一个一维数组。然后,csv将类似于:

x    y
2    1
3    4
....
或者,如果子阵列的长度都相同,我可能能够生成

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

在任何情况下,如果您仍然希望使用csv路径,则需要决定如何将值表示为简单的列行。

不要使用csv。使用pickle(如果您的另一个程序也是python程序;否则:使用JSON或类似的东西,通过使用二进制类型存储更有效;例如msgpack)!编辑:如果只是numpy数组的列表,请阅读numpy文档,因为有一些特殊的存储方法,如@sascha是正确的。看看pickle是否能够按原样加载整个词典?一些numpy值是更复杂的浮点数,为了简单起见,我只使用int。阅读官方pickle文档(它是标准python的一部分),您的问题就会得到回答。存储类/函数和co会变得更加复杂。但是所有本机python类型或它们的组合(比如str->list(float))都将得到100%的支持。再想想:努米的萨维兹!我不确定是否可以使用savez,因为我还需要保留字典结构,而且我不想为每个列表存储一个文件,因为列表的数量可能会越来越大。但我会继续尝试泡菜。不要使用csv。使用pickle(如果您的另一个程序也是python程序;否则:使用JSON或类似的东西,通过使用二进制类型存储更有效;例如msgpack)!编辑:如果只是numpy数组的列表,请阅读numpy文档,因为有一些特殊的存储方法,如@sascha是正确的。看看pickle是否能够按原样加载整个词典?一些numpy值是更复杂的浮点数,为了简单起见,我只使用int。阅读官方pickle文档(它是标准python的一部分),您的问题就会得到回答。存储类/函数和co会变得更加复杂。但是所有本机python类型或它们的组合(比如str->list(float))都将得到100%的支持。再想想:努米的萨维兹!我不确定是否可以使用savez,因为我还需要保留字典结构,而且我不想为每个列表存储一个文件,因为列表的数量可能会越来越大。不过我还是试试泡菜吧。第一种是最有效的吗?我只需要存储和重新加载字典,它不必是csvIs第一个最有效的?我只需要存储和重新加载字典,它不必是csv