如何将结构化数据写入文件,然后稍后将其读回相同的结构?

问题描述 投票:0回答:7

更具体的 875228 欺骗——Python 中的简单数据存储

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

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

过于简单化的话,它看起来像这样: {((('单词','列表'),(1,2),(1,3)),(...)):0.0, ....}

我觉得 python 一定有比我更好的方法,通过一些字符串循环查找 : 和 ( 尝试将其解析为字典。

python serialization
7个回答
62
投票

为什么不使用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 中的字典字符串表示非常相似。并且不存在像pickle那样的任何安全问题。但可能比 cPickle 慢。


12
投票

我会使用

shelve
json
yaml
或其他答案,如其他答案所建议。

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

但是如果你真的想解析

dict
的文本,并且它只包含
str
ings、
int
s 和
tuple
s,就像你所展示的那样,你可以使用
ast.literal_eval
来解析它。它更安全,因为你不能用它评估完整的表达式 - 它只适用于
str
ings、数字、
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)}

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/

它具有简单的文件保存/加载功能,我现在不记得了。


0
投票

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


0
投票

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

y_serial.py 模块:: 使用 SQLite 仓库 Python 对象

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

http://yserial.sourceforge.net

压缩奖励可能会将您的 6GB 字典减少到 1GB。如果您不想存储一系列字典,该模块还包含一个 file.gz 解决方案,考虑到您的字典大小,该解决方案可能更合适。


0
投票

根据您的要求,这里有一些替代方案:

  • numpy
    以紧凑的形式存储您的纯数据并很好地执行分组/批量操作

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

  • 一些第三方存储模块,例如

    stash
    ,存储任意纯数据

  • 适当的数据库,例如mongodb 用于毛茸茸的数据或 mysql 或 sqlite 纯数据和更快的检索


0
投票

对于 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': '一些文本'}]

© www.soinside.com 2019 - 2024. All rights reserved.