【问题标题】:Save and Read a Python Dictionary to/from CSV在 CSV 中保存和读取 Python 字典
【发布时间】:2017-03-25 04:24:33
【问题描述】:

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

我的字典将一个字符串映射到一个 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 数组列表。

【问题讨论】:

  • 不要使用 csv。使用pickle(如果您的其他程序也是python程序;否则:使用JSON或类似的东西,通过使用二进制类型存储更有效;例如msgpack)! 编辑:如果它只是一个 numpy 数组列表,请阅读 numpys 文档,因为有特殊的存储方法,例如 savez
  • @sascha 是对的。看看wiki.python.org/moin/UsingPickle
  • pickle 能按原样加载整个字典吗?一些 numpy 值是更复杂的浮点数,为了简单起见,我只是使用整数。
  • 阅读官方 pickle 文档(它是标准 python 的一部分),您的问题将得到解答。存储类/函数和 co 变得更加复杂。但是所有原生 python 类型或它们的组合(如 str->list(float) 的字典)都将得到 100% 的支持。再说一遍:考虑 numpy 的 savez!
  • 不确定是否可以使用 savez 因为我还需要保留字典结构,并且我不想为每个列表存储一个文件,因为列表的数量可能会变大。但我会继续尝试泡菜。

标签: python csv pandas numpy dictionary


【解决方案1】:
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”的字段。但我认为我必须连接数组,所以我可以生成一个一维数组。然后 csv 看起来像:

x    y
2    1
3    4
....

或者,如果子数组的长度都相同,我也许可以生成

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

如果您仍想使用 csv 路线,则需要决定如何将值表示为简单的列行。

【讨论】:

  • 第一个效率最高吗?我只需要存储和重新加载字典,它不必是 csv
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 2015-12-24
  • 2018-12-20
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2013-03-02
相关资源
最近更新 更多