Python:如何将列表写入文件,然后将其拉回内存(dict表示为字符串转换为dict)?

30 python pickle

更具体的875228 - 简单数据存储在Python中.

我有一个相当大的字典(6 GB),我需要对它进行一些处理.我正在尝试几种文档聚类方法,所以我需要将整个内容同时存储在内存中.我有其他功能来运行这些数据,但内容不会改变.

目前,每次我想到新函数我都要编写它们,然后重新生成dict.我正在寻找一种方法将此dict写入文件,以便我可以将其加载到内存中而不是重新计算它的所有值.

过分简化事物看起来像:{((('word','list'),(1,2),(1,3)),(...)):0.0,....}

我觉得python必须有一个更好的方式,比我循环查找一些字符串:和(尝试将其解析为字典.

Nad*_*mli 61

为什么不使用python pickle?Python有一个很棒的序列化模块叫做pickle,它很容易使用.

import cPickle
cPickle.dump(obj, open('save.p', 'wb')) 
obj = cPickle.load(open('save.p', 'rb'))
Run Code Online (Sandbox Code Playgroud)

泡菜有两个缺点:

  • 它对于错误或恶意构造的数据是不安全的.切勿取消从不受信任或未经身份验证的来源收到的数据.
  • 格式不是人类可读的.

如果您使用的是python 2.6,则会有一个名为json的内置模块.它就像泡菜一样简单:

import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Run Code Online (Sandbox Code Playgroud)

Json格式是人类可读的,与python中的字典字符串表示非常相似.而且没有像泡菜这样的安全问题.但可能比cPickle慢.


nos*_*klo 12

如其他答案所示,我会使用shelve,或其他任何东西.jsonyaml

shelve特别酷,因为你可以拥有dict磁盘并仍然使用它.值将按需加载.

但是如果你真的想要解析它的文本dict,并且它只包含你所展示的s str,ints和tuples,你可以使用ast.literal_eval它来解析它.它更加安全,因为你不能用它来评估完整的表达式 - 它只适用于strings,数字,tuples,lists,dicts,booleans和None:

>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
Run Code Online (Sandbox Code Playgroud)