小编典典

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

python

我到处搜寻,但找不到任何相关内容…

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

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

谢谢-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

阅读 153

收藏
2021-01-20

共1个答案

小编典典

一些人推荐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”的模块
  • 第二步:创建我的字典对象
  • 第三步:使用上下文管理器来处理新文件的打开/关闭…
  • 步骤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 vs泡菜

这些天您不会看到很多人使用泡菜-我想不出为什么您会想使用泡菜的第一个实现,尤其是当cPickle所做的事情相同(或多或少)时但是快很多!

因此,您可以懒惰并这样做:

import cPickle as pickle

如果您已经构建了使用泡菜的东西,那就太好了…但是 我认为这是一个不好的建议,我完全希望被推荐甚至被指责!
(您应该真正查看使用原始代码的旧实现,pickle并查看是否需要更改任何内容以遵循cPickle模式;如果您使用的是旧版代码或生产代码,则可以节省重构时间(查找/替换所有实例)用cPickle腌制)。

否则,只需:

import cPickle

在您看到对pickle库的引用的任何地方,只需进行相应的替换即可。它们具有相同的load()和dump()方法。

警告警告
我不想再写这篇文章了,但是我似乎有这样的痛苦记忆,那就是不区分load()loads(),和dump()dumps()。该死的…那真是我的愚蠢!简短的答案是load()/
dump()会对类似文件的对象执行此操作,而load()/
dumps()将对类似字符串的对象执行类似的行为(有关更多信息,请参见API,此处)。

同样,我还没有使用过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
2021-01-20