- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经四处搜索,但找不到任何关于此的信息......
我正在寻找一种方法来将字典保存到文件中,然后能够在以后通过读取文件将其加载回变量中。
文件的内容不必是“人类可读的”,它可以随心所欲地乱七八糟。
谢谢 - 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
最佳答案
有几个人推荐了shelve
——我没用过,也不敲。我使用过 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)
如果您随后进入刚刚创建的文件(现在位于您的文件系统上),您可以看到内容。它很乱-丑陋-而且不是很有见地。
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'}
这些天你不会看到很多人使用 pickle - 我想不出为什么你会想要使用 pickle 的第一个实现,特别是当有 cPickle 做同样的事情时(更多或更少)但速度更快!
所以你可以偷懒去做:
import cPickle as pickle
如果你已经构建了一些使用 pickle 的东西,那就太好了......但是我认为这是一个糟糕的建议,我完全希望因为推荐它而被责骂!(你真的应该查看使用原始 pickle
的旧实现,看看是否需要更改任何内容以遵循 cPickle
模式;如果您有遗留代码或正在使用的生产代码,这可以节省您重构的时间(用 cPickle 查找/替换 pickle 的所有实例)。
否则,只是:
import cPickle
在任何你看到对 pickle
库的引用的地方,只需相应地替换即可。它们具有相同的 load() 和 dump() 方法。
Warning 警告 我不想再写这篇文章了,但我似乎有这种痛苦的内存,没有区分 load()
和 loads()
,以及 dump()
和 dumps()
。该死的……我真是太蠢了!简短的回答是 load()/dump() 对类似文件的对象执行此操作,其中 loads()/dumps() 将执行类似的行为,但对类似字符串的对象(在 API 中阅读更多信息,here ).
同样,我没有使用过 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
关于python - 将字典存储在文件中供以后检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322273/
命令 svn status 返回如下内容: ? SomeClient\BUTCHERED.docx M SomeClient\Development notes.txt ?
我是一名优秀的程序员,十分优秀!