我所拥有的是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
答案 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')