[英]Python: How do I write a list to file and then pull it back into memory (dict represented as a string convert to dict) later?
更具体的875228 复制品——简单数据存储在 Python 中。
我有一个相当大的字典(6 GB),我需要对其进行一些处理。 我正在尝试几种文档聚类方法,因此我需要立即将所有内容都放入 memory 中。 我还有其他功能可以在此数据上运行,但内容不会改变。
目前,每当我想到新功能时,我都必须编写它们,然后重新生成 dict。 我正在寻找一种将此字典写入文件的方法,以便我可以将它加载到 memory 而不是重新计算它的所有值。
过度简化它看起来像这样的东西:{((('word','list'),(1,2),(1,3)),(...)):0.0, ....}
我觉得 python 一定有比我循环遍历一些字符串寻找 : 和 ( 试图将其解析到字典中更好的方法。
为什么不使用python pickle ? Python有一个很棒的序列化模块叫做pickle,它很容易使用。
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
泡菜有两个缺点:
如果您使用的是python 2.6,则会有一个名为json的内置模块。 它就像泡菜一样简单:
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Json格式是人类可读的,与python中的字典字符串表示非常相似。 而且没有像泡菜这样的安全问题。 但可能比cPickle慢。
如其他答案所示,我会使用shelve
, json
, yaml
等等。
shelve
特别酷,因为你可以在磁盘上使用dict
并仍然使用它。 值将按需加载。
但是如果你真的想要解析dict
的文本,并且它只包含你已经显示的str
, int
和tuple
,你可以使用ast.literal_eval
来解析它。 这是一个很多更安全,因为你不能用它的eval充分表达-它仅适用于str
英格斯,数字, tuple
S, list
S, dict
S, bool
是指合同和None
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
我建议您使用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/
它带有简单的文件保存/加载功能,我记不清楚这一分钟。
以下是一些替代方案,具体取决于您的要求:
numpy
以简洁的形式存储您的简单数据,并很好地执行组/批量操作
shelve
就像一个由文件支持的大型字典
某些第三方存储模块,例如stash
,存储任意明文数据
适当的数据库,例如用于毛发数据或mysql或sqlite普通数据的mongodb和更快的检索
SourceForge上的此解决方案仅使用标准Python模块:
y_serial.py module ::使用SQLite仓库Python对象
“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。”
http://yserial.sourceforge.net
压缩加值可能会将您的6GB字典减少到1GB。 如果您不希望商店出现一系列词典,该模块还包含一个file.gz解决方案,根据您的字典大小,该解决方案可能更合适。
对于 Unicode 个字符,请使用:
data = [{'key': 1, 'text': 'some text'}]
f = open(path_to_file, 'w', encoding='utf8')
json.dump(data, f, ensure_ascii=False)
f.close()
f = open(path_to_file, encoding="utf8")
data = json.load(f)
print(data)
[{'key': 1, 'text': 'some text'}]
以序列化格式写出来,例如pickle(用于序列化的python标准库模块),或者可能使用JSON(这是一种可以被唤醒以再次产生内存表示的表示)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.