由读取pickle文件的函数检索的字典引发KeyError

时间:2012-06-26 17:02:49

标签: python dictionary pickle

我所拥有的是3个词典,将pickle转储到3个不同的文件中。我原来只为每个文件编写了一个读写函数,总共有6个函数。所以昨晚我试着这样做,所以我只需要使用1个读取功能和1个写入功能。我让write函数工作,但read函数不是。我自昨晚以来一直在寻找解决这个问题的方法,我很厌倦所以你能给予任何帮助我会很感激。 如果你不知道的话,我是编程/ python的新手。这是我正在使用的代码:

w = {} # would be past in as source

def writing(filename, source): 
    with open(filename, 'wb') as st:
        pickle.dump(source, st)

def reading(filename, source):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())

reading('test.txt', w)

我得到的错误是:

Traceback (most recent call last):
  File "./database.py", line 303, in <module>
   pw.check_pwd(p)
  File "./database.py", line 47, in check_pwd
    if self.pwds[self.user] == hashlib.sha512(self.pwd + self.salt).hexdigest():
KeyError: 'Codex' this was the error I was getting sorry for the bad post

4 个答案:

答案 0 :(得分:1)

你需要在第二个函数中return source

def reading(filename, source):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())
    return source

否则Python将默认不返回任何内容(None)。

答案 1 :(得分:1)

我不知道你在尝试什么问题,但我非常有信心你想要全局w变量中的unpickling结果,对吧?好吧,你不能这样做:当你将值归因于source变量时,你只更新局部变量source,但变量w仍然指向相同的值。也许this answer可以帮助您了解正在发生的事情。

它有各种解决方案。我最喜欢的一个是@katrielatex:返回值:

def reading(filename, source):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())
    return source
w = reading(filename, w)

实际上,您甚至不需要source参数:

def reading(filename):
    with open(filename, 'rb') as st:
        source = pickle.loads(st.read())
        return source

w = reading(filename)

另一个解决方案是source指向的to update the dictionary。在这种情况下,不需要返回:

def reading(filename, source):
    with open(filename, 'rb') as st:
        source.update(pickle.loads(st.read()))

reading(filename, w)

此外,您可以在函数内部使w成为全局变量(但这是最糟糕的解决方案):

def reading(filename):
    global w
    with open(filename, 'rb') as st:
        w = pickle.loads(st.read())

reading(filename)

答案 2 :(得分:1)

如果您确定要取回字典,那么reading()也可以像

一样
def reading(filename, source):
    with open(filename, 'rb') as st:
        tmp = pickle.loads(st.read())
    source.update(tmp)

但是,老实说,return solution by katrielalex更好。

答案 3 :(得分:0)

阅读功能只需要一个文件名,它应该返回一些内容:

def save(filename, data): 
    with open(filename, 'wb') as f:
        pickle.dump(data, f)

def load(filename):
    with open(filename, 'rb') as f:
        return pickle.load(f)

示例:

save('data.pickle', [a, b, c])
a, b, c = load('data.pickle')