将字典存储在文件中以供以后检索

Ryf*_*lex 9 python dictionary load store python-2.7

我有一个搜索,但找不到任何关于这个......

我正在寻找一种方式来保存一个字典文件,然后再能够通过读取文件在日后加载它放回一个变量.

该文件的内容不必是"人类可读"它可以像它想要的凌乱.

谢谢 - 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
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "C:\test3.py", line 35, in <module>
    BDICT = pickle.load(dict_items_open)
EOFError
Run Code Online (Sandbox Code Playgroud)

Jus*_*oll 20

有些人推荐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)
Run Code Online (Sandbox Code Playgroud)

刚刚发生了什么?

  • Step1:导入名为'pickle'的模块
  • Step2:创建了我的字典对象
  • Step3:使用上下文管理器来处理新文件的打开/关闭...
  • Step4:dump()字典的内容(被称为'pickling'对象),然后将其写入文件(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.
Run Code Online (Sandbox Code Playgroud)

下一个是什么?

要将BACK带入我们的程序,我们只需执行以下操作:

import pickle

with open("mySavedDict.txt", "rb") as myFile:
    myNewPulledInDictionary = pickle.load(myFile)

print myNewPulledInDictionary
Run Code Online (Sandbox Code Playgroud)

其中提供以下回报:

{'four': 'no-more', 'one': 'banana', 'three': 'banana', 'two': 'banana'}
Run Code Online (Sandbox Code Playgroud)

cPickle vs Pickle

这些天你不会看到很多人使用泡菜 - 我无法想到为什么你会想要使用pickle的第一个实现,特别是当有cPickle做同样的事情时(或多或少)但要快得多!

所以你可以懒得做:

import cPickle as pickle
Run Code Online (Sandbox Code Playgroud)

如果你已经建立了一些使用泡菜的东西,这是很棒的...但我认为这是一个糟糕的建议,我完全期望被推荐甚至推荐!(您应该真正查看使用原始文件的旧实现,pickle看看是否需要更改任何内容以遵循cPickle模式;如果您使用的是遗留代码或生产代码,这可以节省您重构的时间(查找/替换所有实例)与cPickle泡菜).

否则,只需:

import cPickle
Run Code Online (Sandbox Code Playgroud)

无论你在哪里看到对pickle库的引用,都要相应地进行替换.它们具有相同的load()和dump()方法.

警告警告我不想再写这篇文章,但我似乎有这种痛苦的记忆,没有区分load()loads(),dump()dumps().该死的......这对我来说是愚蠢的!简短的回答是load()/ dump()将它传递给类似文件的对象,而load()/ dumps()将执行类似的行为,但是对于类似字符串的对象(在API中阅读更多关于它的信息,这里).

再一次,我没有使用过shelve,但如果它对你(或其他人)有效 - 那么就是!

回应您的编辑

您需要在最后dict_items_read = dict_items_open.read()从上下文管理器中删除它.该文件已经打开并读入.您不会像读取字符串的文本文件那样读取它...它存储了pickle 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
Run Code Online (Sandbox Code Playgroud)

  • 但是,对于Python 3+,请仅使用`pickle`:/sf/answers/2599715401/(我同意2.7标签,但这适用于在搜索Python 3+时最终出现在这里的其他人具体的答案) (2认同)

xgo*_*ord 5

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()
Run Code Online (Sandbox Code Playgroud)