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

标签 python python-2.7 dictionary load store

我已经四处搜索,但找不到任何关于此的信息......

我正在寻找一种方法来将字典保存到文件中,然后能够在以后通过读取文件将其加载回变量中。

文件的内容不必是“人类可读的”,它可以随心所欲地乱七八糟。

谢谢 - 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(或其明显更快的变体 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)

那么刚刚发生了什么?

  • 第 1 步:导入名为“pickle”的模块
  • 第 2 步:创建我的字典对象
  • 第 3 步:使用 context manager 处理新文件的打开/关闭...
  • 第 4 步: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.

接下来呢?

为了将其带回我们的程序中,我们只需执行以下操作:

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() 方法。

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/

相关文章:

python - 无法导入名称 'db'(flask、sqlalchemy)

python - Django - 如何将 user_pass_test 与 url 一起使用

javascript - 如何正确使用 mechanize 来抓取 AJAX 网站

Python:访问使用变量生成的字典键的值

Python基于key合并嵌套对象

python - 如果最耗时的部分是posix.waitpid,如何提高代码性能?

python - 使用带有 Python2.7.10 的 get-pip.py 安装 pip 时出错

python - 终止剩余的线程

python - 何时使用静态方法和类方法

arrays - Swift 字典 : is it NOT possible to have an Array be the Value for a Key?