存储Python字典
我习惯于使用CSV文件将数据导入和导出Python,但这显然是一个挑战。有没有简单的方法将字典(或字典集)存储在JSON或文件中 例如:存储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
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()
更容易?