0

我所拥有的是 3 个字典与 pickle 一起转储到 3 个不同的文件。我最初只是为每个文件编写了一个读写函数,所以总共有 6 个函数。所以昨晚我试着做到了,所以我只需要使用 1 个读取功能和 1 个写入功能。我得到了写功能,但读功能没有。自昨晚以来,我一直在寻找解决此问题的方法,但我受够了,因此您可以提供任何帮助,我将不胜感激。如果你不知道,我是编程/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

4 回答 4

1

您需要return source在第二个功能中:

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

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

于 2012-06-26T17:04:26.910 回答
1

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

有各种解决方案。我最喜欢的之一是@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. 在这种情况下,不需要返回:

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)
于 2012-06-26T17:14:14.377 回答
1

如果你确定你会得到一个字典,你reading()也可以像

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

但是,老实说,returnkatrielalex 的解决方案更好。

于 2012-06-26T17:15:08.693 回答
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')
于 2012-06-26T17:20:09.337 回答