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

时间:2009-05-20 22:02:22

标签: python pickle

更具体的875228—Simple data storing in Python欺骗。

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

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

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

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

6 个答案:

答案 0 :(得分:60)

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

import cPickle
cPickle.dump(obj, open('save.p', 'wb')) 
obj = cPickle.load(open('save.p', 'rb'))

泡菜有两个缺点:

  • 对于错误的或者是不安全的 恶意构造的数据。决不 unpickle收到的数据 不受信任或未经认证的来源。
  • 格式不是人类可读的。

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

import json
encoded = json.dumps(obj)
obj = json.loads(encoded)

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

答案 1 :(得分:12)

我会根据其他答案的建议使用shelvejsonyaml或其他任何内容。

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

但是,如果您真的要解析dict的文字,并且它只包含strinttuple就像您展示的那样,您可以使用ast.literal_eval来解析它。它更加安全,因为您无法使用它来评估完整的表达式 - 它仅适用于str,数字,tuple s,list s,dict s ,bool eans和None

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

答案 2 :(得分:4)

我建议您使用YAML作为文件格式,以便在光盘上修改它

How does it look:
  - It is indent based
  - It can represent dictionaries and lists
  - It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html

要在python中获取它,只需easy_install pyyaml。见http://pyyaml.org/

它带有简单的文件保存/加载功能,我记不起这一分钟了。

答案 3 :(得分:0)

根据您的要求,有以下几种选择:

  • numpy以简洁的形式存储您的简单数据并执行群组/群发操作

  • shelve就像一个由文件备份的大型字典

  • 某些第三方存储模块,例如stash,存储任意明文数据

  • 正确的数据库,例如mongodb用于毛发数据或mysql或sqlite普通数据和更快的检索

答案 4 :(得分:0)

SourceForge上的此解决方案仅使用标准Python模块:

y_serial.py module ::使用SQLite的仓库Python对象

“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“

http://yserial.sourceforge.net

压缩加值可能会将您的6GB字典减少到1GB。如果您不希望商店出现一系列词典,该模块还包含一个file.gz解决方案,根据您的字典大小,该解决方案可能更合适。

答案 5 :(得分:0)

以序列化格式写出来,例如pickle(用于序列化的python标准库模块),或者可能使用JSON(这是一种可以被证明可以再次生成内存表示的表示形式)。