我已经搜索了一下但却找不到任何相关的内容......
我正在寻找一种方法来将字典保存到文件中,然后通过读取文件将其加载回变量中。
文件的内容不必是人类可读的"它可能像它想要的一样混乱。
由于 - Hyflex
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:
dict_items_read = dict_items_open.read()
if dict_items_read:
BDICT = pickle.load(dict_items_open)
firstrunDICT = False
print BDICT
错误:
Traceback (most recent call last):
File "C:\test3.py", line 35, in <module>
BDICT = pickle.load(dict_items_open)
EOFError
答案 0 :(得分:19)
有些人推荐shelve
- 我没有使用它,我也没有敲它。我使用了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)
如果您然后进入刚刚创建的文件(现在位于您的文件系统上),您可以看到内容。它很混乱 - 丑陋 - 而且不是很有洞察力。
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.
要将BACK带入我们的计划,我们只需执行以下操作:
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做同样的事情时(更多)或更少)但更快!
所以你可以懒得做:
import cPickle as pickle
如果你已经建立了一些使用泡菜的东西,那就太棒了......但是我认为这是一个不好的推荐,我完全希望甚至推荐这个推荐!(你应该真的查看使用原始pickle
的旧实现,看看是否需要更改任何内容以遵循cPickle
模式;如果您使用的是遗留代码或生产代码,这可以节省您重构的时间(用cPickle查找/替换所有pickle实例。
否则,只是:
import cPickle
在任何地方,您都会看到pickle
库的引用,只需相应地替换即可。它们具有相同的load()和dump()方法。
警告警告我不想再写这篇文章了,但我似乎有这种痛苦的记忆,没有区分load()
和{{1 }},loads()
和dump()
。该死的......这对我来说是愚蠢的!简短的回答是load()/ dump()将它传递给类似文件的对象,而load()/ dumps()将执行类似的行为,但是类似于字符串的对象(在API中了解更多信息,{ {3}})。
同样,我没有使用dumps()
,但如果它对你(或其他人)有用 - 那么就是!
您最后需要从上下文管理器中删除shelve
。该文件已经打开并读入。您不会像读取文本文件那样读取它...它存储了pickle python对象。它不适合眼睛!它适用于load()。
您的代码已修改...对我来说效果很好(复制/粘贴并运行下面的代码,看看它是否有效)。请注意底部附近我已删除了文件对象的dict_items_read = dict_items_open.read()
。
read()
答案 1 :(得分:4)
Python有shelve
模块。它可以将许多对象存储在一个文件中,该文件可以在以后打开并作为对象读入,但它依赖于操作系统。
import shelve
dict1 = #dictionary
dict2 = #dictionary
#flags:
# c = create new shelf; this can't overwrite an old one, so delete the old one first
# r = read
# w = write; you can append to an old shelf
shelf = shelve.open("filename", flag="c")
shelf['key1'] = dict1
shelf['key2'] = dict2
shelf.close()
#reading:
shelf = shelve.open("filename", flag='r')
for key in shelf.keys():
newdict = shelf[key]
#do something with it
shelf.close()
答案 2 :(得分:3)
您要找的是shelve
。
答案 3 :(得分:3)
您还可以使用Pickle执行此任务。 Here's a blog post解释了如何做到这一点。
答案 4 :(得分:1)
两个函数,用于创建用于保存字典和加载字典(之前已保存)的文本文件,以便再次使用。
import pickle
def SaveDictionary(dictionary,File):
with open(File, "wb") as myFile:
pickle.dump(dictionary, myFile)
myFile.close()
def LoadDictionary(File):
with open(File, "rb") as myFile:
dict = pickle.load(myFile)
myFile.close()
return dict
可以通过以下方式调用这些函数:
SaveDictionary(mylib.Members,"members.txt") # saved dict. in a file
members = LoadDictionary("members.txt") # opened dict. of members