我习惯使用CSV文件在Python中输入和输出数据,但这存在明显的挑战。是否有简单的方法将字典(或字典集)存储在JSON或pickle文件中?

例如:

data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"

我想知道如何保存这个,然后如何加载它回来。


当前回答

如果你想要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}

对于klepto,如果使用serialized=True,字典将被写入memo。PKL是一个pickle的字典,而不是清晰的文本。

你可以在这里获得klepto: https://github.com/uqfoundation/klepto

对于pickle来说,Dill可能是比pickle本身更好的选择,因为Dill可以序列化python中的几乎任何东西。小偷也可以用莳萝。

你可以在这里买到莳萝:https://github.com/uqfoundation/dill

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

其他回答

较短的代码

保存和加载所有类型的python变量(包括字典),每个变量只需一行代码。

data = {'key1': 'keyinfo', 'key2': 'keyinfo2'}

保存:

pickle.dump(data, open('path/to/file/data.pickle', 'wb'))
   

加载:

data_loaded = pickle.load(open('path/to/file/data.pickle', 'rb'))

也许这很明显,但在我试图使它更短之前,我在顶部的答案中使用了两行解。

泡菜保存:

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)

有关协议参数的其他信息,请参阅pickle模块文档。

泡菜负载:

with open('data.p', 'rb') as fp:
    data = pickle.load(fp)

JSON保存:

import json

with open('data.json', 'w') as fp:
    json.dump(data, fp)

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

json.dump(data, fp, sort_keys=True, indent=4)

JSON负载:

with open('data.json', 'r') as fp:
    data = json.load(fp)

写入文件:

import json
myfile.write(json.dumps(mydict))

从文件中读取:

import json
mydict = json.loads(myfile.read())

Myfile是存放dict的文件的file对象。

也可以看到加速包ujson:

import ujson

with open('data.json', 'wb') as fp:
    ujson.dump(data, fp)

如果您正在序列化,但在其他程序中不需要数据,我强烈推荐使用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()