有几个人推荐了shelve——我没用过,也不敲了。我使用过pickle/cPickle,我将提供以下方法:
Pickle/cPickle的使用方法(精简版)...
有许多原因让您使用 Pickle(或其明显更快的变体 cPickle)。简而言之,Pickle 是一种在进程之外存储对象的方法。
Pickle 不仅为您提供了在 python 进程之外存储对象的选项,而且还以序列化的方式进行。意思是,先进先出行为(FIFO)。
import pickle
## I am making up a dictionary here to show you how this works...
## Because I want to store this outside of this single run, it could be that this
## dictionary is dynamic and user based - so persistance beyond this run has
## meaning for me.
myMadeUpDictionary = {"one": "banana", "two": "banana", "three": "banana", "four": "no-more"}
with open("mySavedDict.txt", "wb") as myFile:
pickle.dump(myMadeUpDictionary, myFile)
那么刚刚发生了什么?
- 第一步:导入一个名为“pickle”的模块
- 第二步:创建我的字典对象
- Step3:使用context manager 处理新文件的打开/关闭...
- 第 4 步:dump() 字典的内容(被称为“腌制”对象),然后将其写入文件 (mySavedDict.txt)。
如果您随后进入刚刚创建的文件(现在位于您的文件系统上),您可以看到内容。它很凌乱-丑陋-而且不是很有洞察力。
nammer@crunchyQA:~/workspace/SandBox/POSTS/Pickle & cPickle$ cat mySavedDict.txt
(dp0
S'four'
p1
S'no-more'
p2
sS'three'
p3
S'banana'
p4
sS'two'
p5
g4
sS'one'
p6
g4
s.
那么接下来呢?
要将它带回到我们的程序中,我们只需执行以下操作:
import pickle
with open("mySavedDict.txt", "rb") as myFile:
myNewPulledInDictionary = pickle.load(myFile)
print myNewPulledInDictionary
提供以下回报:
{'four': 'no-more', 'one': 'banana', 'three': 'banana', 'two': 'banana'}
cPickle 与 Pickle
这些天你不会看到很多人使用 pickle - 我无法想到你为什么要使用 pickle 的第一个实现,特别是当有 cPickle 做同样的事情时(更多或更少)但要快得多!
所以你可以偷懒做:
import cPickle as pickle
如果您已经构建了使用 pickle 的东西,那就太好了...但是 我认为这是一个糟糕的建议,我完全希望即使推荐它也会受到责骂!(你真的应该查看使用原始 pickle 的旧实现,看看是否需要更改任何内容以遵循 cPickle 模式;如果您有遗留代码或正在使用的生产代码,这可以节省重构时间(查找/替换所有使用 cPickle 的 pickle 实例)。
否则,只需:
import cPickle
在您看到对pickle 库的引用的任何地方,只需相应地替换即可。它们具有相同的 load() 和 dump() 方法。
警告警告我不想再写这篇文章了,但我似乎有一种痛苦的记忆,没有区分load()和loads(),并且dump() 和 dumps()。该死的……那是我的愚蠢!简短的回答是 load()/dump() 对类似文件的对象执行此操作,其中 load()/dumps() 将执行类似的行为,但对类似字符串的对象执行类似的行为(在 API 中阅读有关它的更多信息,@ 987654322@)。
再说一次,我还没有使用过shelve,但如果它对你(或其他人)有用,那就太好了!
回复您的编辑
最后,您需要从上下文管理器中删除 dict_items_read = dict_items_open.read()。该文件已经打开并读入。您不会像读取文本文件那样读取它来提取字符串......它正在存储腌制的python对象。不是为了眼睛!它适用于 load()。
您的代码已修改...对我来说效果很好(复制/粘贴并运行下面的代码,看看它是否有效)。请注意,在底部附近,我删除了文件对象的 read()。
import cPickle as pickle
BDICT = {}
## Automatically generated START
name = "BOB"
name_title = name.title()
count = 5
BDICT[name_title] = count
name = "TOM"
name_title = name.title()
count = 5
BDICT[name_title] = count
name = "TIMMY JOE"
name_title = name.title()
count = 5
BDICT[name_title] = count
## Automatically generated END
if BDICT:
with open('DICT_ITEMS.txt', 'wb') as dict_items_save:
pickle.dump(BDICT, dict_items_save)
BDICT = {} ## Wiping the dictionary
## Usually in a loop
firstrunDICT = True
if firstrunDICT:
with open('DICT_ITEMS.txt', 'rb') as dict_items_open:
BDICT = pickle.load(dict_items_open)
firstrunDICT = False
print BDICT