所以,我想将字典存储在持久文件中。有没有办法使用常规字典方法来添加,打印或删除该文件中字典中的条目?
似乎我可以使用cPickle存储字典并加载它,但我不知道从哪里拿它。
答案 0 :(得分:18)
如果您的密钥(不一定是值)是字符串,shelve标准库模块可以非常无缝地执行您想要的操作。
答案 1 :(得分:7)
与Pete的答案类似,我喜欢使用JSON,因为它很好地映射到python数据结构并且非常易读:
持久数据非常简单:
>>> import json
>>> db = {'hello': 123, 'foo': [1,2,3,4,5,6], 'bar': {'a': 0, 'b':9}}
>>> fh = open("db.json", 'w')
>>> json.dump(db, fh)
并加载它大致相同:
>>> import json
>>> fh = open("db.json", 'r')
>>> db = json.load(fh)
>>> db
{'hello': 123, 'bar': {'a': 0, 'b': 9}, 'foo': [1, 2, 3, 4, 5, 6]}
>>> del new_db['foo'][3]
>>> new_db['foo']
[1, 2, 3, 5, 6]
此外,JSON加载不会遇到shelve
和pickle
所遇到的相同安全问题,尽管IIRC它比pickle慢。
如果要保存每个操作,可以继承Python dict对象:
import os
import json
class DictPersistJSON(dict):
def __init__(self, filename, *args, **kwargs):
self.filename = filename
self._load();
self.update(*args, **kwargs)
def _load(self):
if os.path.isfile(self.filename)
and os.path.getsize(self.filename) > 0:
with open(self.filename, 'r') as fh:
self.update(json.load(fh))
def _dump(self):
with open(self.filename, 'w') as fh:
json.dump(self, fh)
def __getitem__(self, key):
return dict.__getitem__(self, key)
def __setitem__(self, key, val):
dict.__setitem__(self, key, val)
self._dump()
def __repr__(self):
dictrepr = dict.__repr__(self)
return '%s(%s)' % (type(self).__name__, dictrepr)
def update(self, *args, **kwargs):
for k, v in dict(*args, **kwargs).items():
self[k] = v
self._dump()
您可以这样使用:
db = DictPersistJSON("db.json")
db["foo"] = "bar" # Will trigger a write
效率低下,但可以让你快速离开。
答案 2 :(得分:5)
程序加载时从文件中取消,在程序运行时修改为内存中的普通字典,程序退出时腌制到文件?不确定你在这里要求的更多。
答案 3 :(得分:1)
假设键和值具有repr
的工作实现,一种解决方案是将字典(repr(dict)
)的字符串表示保存到文件。你可以使用eval
函数(eval(inputstring)
)加载它。这种技术有两个主要缺点:
1)对于具有不可用的repr实现的类型(或者甚至可能看起来有效但失败)不会起作用。你需要至少注意一些事情。
2)您的文件加载机制基本上是直接执行Python代码。除非您完全控制输入,否则不太适合安全性。
它有一个优点:非常容易做到。
答案 4 :(得分:1)
我最喜欢的方法(不使用标准的python词典函数):使用PyYaml读/写YAML文件。 See this answer for details,总结如下:
创建一个YAML文件,“employment.yml”:
new jersey:
mercer county:
pumbers: 3
programmers: 81
middlesex county:
salesmen: 62
programmers: 81
new york:
queens county:
plumbers: 9
salesmen: 36
第3步:在Python中阅读
import yaml
file_handle = open("employment.yml")
my__dictionary = yaml.safe_load(file_handle)
file_handle.close()
现在my__dictionary拥有所有值。如果您需要动态执行此操作,请创建一个包含YAML的字符串并使用yaml.safe_load解析它。
答案 5 :(得分:0)
如果你必须处理小切片,泡菜就可以了。如果你打算使用更复杂的东西,请选择berkelydb。它基本上用于存储键:值对。
答案 6 :(得分:0)
答案 7 :(得分:0)
您是否考虑过使用 dbm?
import dbm
import pandas as pd
import numpy as np
db = b=dbm.open('mydbm.db','n')
#create some data
df1 = pd.DataFrame(np.random.randint(0, 100, size=(15, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(101,200, size=(10, 3)), columns=list('EFG'))
#serialize the data and put in the the db dictionary
db['df1']=df1.to_json()
db['df2']=df2.to_json()
# in some other process:
db=dbm.open('mydbm.db','r')
df1a = pd.read_json(db['df1'])
df2a = pd.read_json(db['df2'])
即使没有 db.close() 也能正常工作