存储Python词典

mik*_*ike 162 python json dictionary save pickle

我习惯使用.csv文件将数据输入和输出Python,但是存在明显的挑战.关于在json或pck文件中存储字典(或字典集)的简单方法的任何建议?例如:

data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Run Code Online (Sandbox Code Playgroud)

我想知道如何保存它,然后如何加载它.

Mar*_*rty 391

泡菜保存:

try:
    import cPickle as pickle
except ImportError:  # python 3.x
    import pickle

with open('data.p', 'wb') as fp:
    pickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
Run Code Online (Sandbox Code Playgroud)

有关参数的其他信息,请参阅pickle模块文档protocol.

泡菜负荷:

with open('data.p', 'rb') as fp:
    data = pickle.load(fp)
Run Code Online (Sandbox Code Playgroud)

JSON保存:

import json

with open('data.json', 'w') as fp:
    json.dump(data, fp)
Run Code Online (Sandbox Code Playgroud)

提供额外的参数,如sort_keysindent获得一个漂亮的结果.参数sort_keys将按字母顺序对键进行排序,缩进将使用indent=N空格缩进数据结构.

json.dump(data, fp, sort_keys=True, indent=4)
Run Code Online (Sandbox Code Playgroud)

JSON加载:

with open('data.json', 'r') as fp:
    data = json.load(fp)
Run Code Online (Sandbox Code Playgroud)

  • 如果你在转储调用中添加**sort_keys**和**indent**参数,你会得到更漂亮的结果.例如:`json.dump(data,fp,sort_keys = True,indent = 4)`.更多信息可以在[这里]找到(https://docs.python.org/2/library/json.html) (11认同)
  • JSON本身就是字典(尽管它们在内存中显然不像python字典那样,出于持久性目的,它们是相同的).实际上,json中的基础单元是"对象",它被定义为{<string>:<value>}.看起来熟悉?标准库中的json模块支持每种Python本机类​​型,并且可以使用json的最小知识轻松扩展以支持用户定义的类.[JSON主页](http://www.json.org/)完全定义了超过3个打印页面的语言,因此很容易快速吸收/消化. (4认同)
  • 也值得了解`pickle.dump`的第三个参数。如果文件不需要人类可读,那么它可以大大加快速度。 (2认同)
  • 对于python 3,使用`import pickle` (2认同)

agf*_*agf 32

最小的例子,直接写入文件:

import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))
Run Code Online (Sandbox Code Playgroud)

或安全地开/关:

import json
with open(filename, 'wb') as outfile:
    json.dump(data, outfile)
with open(filename) as infile:
    data = json.load(infile)
Run Code Online (Sandbox Code Playgroud)

如果要将其保存在字符串而不是文件中:

import json
json_str = json.dumps(data)
data = json.loads(json_str)
Run Code Online (Sandbox Code Playgroud)


Ell*_*ott 7

另请参阅加速包ujson. https://pypi.python.org/pypi/ujson

import ujson
with open('data.json', 'wb') as fp:
    ujson.dump(data, fp)
Run Code Online (Sandbox Code Playgroud)


Raf*_*ler 5

要写入文件:

import json
myfile.write(json.dumps(mydict))
Run Code Online (Sandbox Code Playgroud)

要从文件中读取:

import json
mydict = json.loads(myfile.read())
Run Code Online (Sandbox Code Playgroud)

myfile 是存储dict的文件的文件对象.


g.d*_*d.c 5

如果您在序列化之后但不需要其他程序中的数据,我强烈推荐该shelve模块.把它想象成一个持久的字典.

myData = shelve.open('/path/to/file')

# check for values.
keyVar in myData

# set values
myData[anotherKey] = someValue

# save the data for future use.
myData.close()
Run Code Online (Sandbox Code Playgroud)

  • 如果你想存储整个字典,或者加载整个字典,``json`会更方便.`shelve`只能一次访问一个密钥. (2认同)

Mik*_*rns 5

如果您想要pickle或的替代品json,您可以使用klepto.

>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache        
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump() 
>>> 
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}
Run Code Online (Sandbox Code Playgroud)

使用klepto,如果您使用了serialized=True,则字典将被写入memo.pkl为腌制字典而不是明文。

你可以到klepto这里:https : //github.com/uqfoundation/klepto

dill可能是酸洗的更好选择pickle,因为它dill可以序列化 python 中的几乎任何东西。 klepto也可以使用dill

你可以到dill这里:https : //github.com/uqfoundation/dill

前几行的额外 mumbo-jumbo 是因为klepto可以配置为将字典存储到文件、目录上下文或 SQL 数据库中。无论您选择什么作为后端存档,API 都是相同的。它为您提供了一个“可存档的”字典,您可以使用它loaddump与存档进行交互。