存储Python字典

存储Python字典,python,json,dictionary,save,pickle,Python,Json,Dictionary,Save,Pickle,我习惯于使用CSV文件将数据导入和导出Python,但这显然是一个挑战。有没有简单的方法将字典(或字典集)存储在JSON或文件中 例如: data = {} data ['key1'] = "keyinfo" data ['key2'] = "keyinfo2" 我想知道如何保存此文件,以及如何将其重新加载。要写入文件: import json myfile.write(json.dumps(mydict)) import json json.dump

我习惯于使用CSV文件将数据导入和导出Python,但这显然是一个挑战。有没有简单的方法将字典(或字典集)存储在JSON或文件中

例如:

data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
我想知道如何保存此文件,以及如何将其重新加载。

要写入文件:

import json
myfile.write(json.dumps(mydict))
import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))
要从文件中读取,请执行以下操作:

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

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

最简单的示例,直接写入文件:

import json
myfile.write(json.dumps(mydict))
import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))
或安全打开/关闭:

import json
with open(filename, 'wb') as outfile:
    json.dump(data, outfile)
with open(filename) as infile:
    data = json.load(infile)
如果要将其保存为字符串而不是文件:

import json
json_str = json.dumps(data)
data = json.loads(json_str)

如果您正在进行序列化,但不需要其他程序中的数据,我强烈建议使用
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()
保存:

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)
with open('data.p', 'rb') as fp:
    data = pickle.load(fp)
import json

with open('data.json', 'w') as fp:
    json.dump(data, fp)
with open('data.json', 'r') as fp:
    data = json.load(fp)
有关
协议
参数的更多信息,请参阅

加载:

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)
with open('data.p', 'rb') as fp:
    data = pickle.load(fp)
import json

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

保存:

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)
with open('data.p', 'rb') as fp:
    data = pickle.load(fp)
import json

with open('data.json', 'w') as fp:
    json.dump(data, fp)
with open('data.json', 'r') as fp:
    data = json.load(fp)
提供额外的参数,如
排序键
缩进
,以获得漂亮的结果。参数sort_keys将按字母顺序对键进行排序,indent将使用
indent=N
空格缩进数据结构

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

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)
with open('data.p', 'rb') as fp:
    data = pickle.load(fp)
import json

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

如果您想要
pickle
json
的替代方案,可以使用
klepot

>>> 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}
使用
klepot
,如果您使用了
serialized=True
,字典将作为一个pickle字典而不是明文写入
memo.pkl

您可以在此处获得
klepot

dill
可能比
pickle
本身更适合酸洗,因为
dill
几乎可以序列化python中的任何内容
klepot
也可以使用
dill

您可以在此处获得dill:


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

还可以查看加速包:


如果保存到JSON文件,最好且最简单的方法是:

import json
with open("file.json", "wb") as f:
    f.write(json.dumps(dict).encode("utf-8"))

为了完整性,我们应该包括ConfigParser和ConfigParser,它们分别是Python2和Python3标准库的一部分。该模块读取和写入config/ini文件,并且(至少在Python3中)在很多方面的行为类似于字典。它的另一个好处是,您可以将多个字典存储到config/ini文件的单独部分中,并调用它们。好极了

Python2.7.x示例

import ConfigParser

config = ConfigParser.ConfigParser()

dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}

# Make each dictionary a separate section in the configuration
config.add_section('dict1')
for key in dict1.keys():
    config.set('dict1', key, dict1[key])
   
config.add_section('dict2')
for key in dict2.keys():
    config.set('dict2', key, dict2[key])

config.add_section('dict3')
for key in dict3.keys():
    config.set('dict3', key, dict3[key])

# Save the configuration to a file
f = open('config.ini', 'w')
config.write(f)
f.close()

# Read the configuration from a file
config2 = ConfigParser.ConfigParser()
config2.read('config.ini')

dictA = {}
for item in config2.items('dict1'):
    dictA[item[0]] = item[1]

dictB = {}
for item in config2.items('dict2'):
    dictB[item[0]] = item[1]

dictC = {}
for item in config2.items('dict3'):
    dictC[item[0]] = item[1]

print(dictA)
print(dictB)
print(dictC)
Python3.X示例

import configparser

config = configparser.ConfigParser()

dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'}
dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'}
dict3 = {'x':1, 'y':2, 'z':3}

# Make each dictionary a separate section in the configuration
config['dict1'] = dict1
config['dict2'] = dict2
config['dict3'] = dict3

# Save the configuration to a file
f = open('config.ini', 'w')
config.write(f)
f.close()

# Read the configuration from a file
config2 = configparser.ConfigParser()
config2.read('config.ini')

# ConfigParser objects are a lot like dictionaries, but if you really
# want a dictionary you can ask it to convert a section to a dictionary
dictA = dict(config2['dict1'] )
dictB = dict(config2['dict2'] )
dictC = dict(config2['dict3'])

print(dictA)
print(dictB)
print(dictC)
控制台输出 config.ini的内容
我的用例是将多个JSON对象保存到一个文件中,这对我有所帮助。但是为了服务于我的用例,答案并不完整,因为每次保存新条目时都会覆盖旧数据

要在一个文件中保存多个条目,必须检查旧内容(即先读后写)。保存JSON数据的典型文件将具有
列表
对象
作为根。因此,我认为我的JSON文件总是有一个对象的
列表
,每次我向其中添加数据时,我只需首先加载列表,将新数据附加到其中,然后将其转储回文件的一个可写实例(
w
):

def saveJson(url,sc):#此函数将两个值写入文件
newdata={'url':url,'sc':sc}
json_path=“db/file.json”
旧列表=[]
使用open(json_path)作为myfile:#首先读取内容
old_list=json.load(myfile)
旧列表。追加(新数据)
将open(json_path,“w”)作为myfile:#覆盖整个内容
dump(old_list,myfile,sort_key=True,indent=4)
返回“成功”
新的JSON文件将如下所示:

[
    {
        "sc": "a11",
        "url": "www.google.com"
    },
    {
        "sc": "a12",
        "url": "www.google.com"
    },
    {
        "sc": "a13",
        "url": "www.google.com"
    }
]

注意:必须有一个名为
file.json
的文件,其中包含
[]
作为此方法工作的初始数据


PS:与原始问题无关,但这种方法也可以进一步改进,首先检查我们的条目是否已经存在(基于一个或多个键),然后再追加并保存数据。

您是否阅读了或标准模块的文档?查看您是要存储整个dict,还是要加载整个dict,
json
更方便
shelve
一次只能访问一个键。您应该知道json具有将文件作为参数并直接写入它们的功能?
json.dump(myfile)
json.load(myfile)
json本机生成字典(虽然它们在内存中的行为明显不同于python字典,但出于持久性目的,它们是相同的).看起来熟悉吗?标准库中的json模块支持每种Python本机类型,并且可以通过对json的最少了解轻松地进行扩展,以支持用户定义的类。完全定义语言只需3个打印页面,因此易于快速吸收/消化。
pickle.dump的第三个参数值得了解
。如果文件不需要人类可读,那么它可以大大加快速度。如果在转储调用中添加排序键和缩进参数,则会得到更漂亮的结果。例如:
json.dump(data,fp,sort\u keys=True,indent=4)
。可以找到更多信息,您可能应该使用
pickle.dump(data,fp,protocol=pickle.HIGHEST_protocol)
对于Python3,使用
import pickle
为什么这比另一个答案中概述的
json.dump()
更容易?