我已经浏览了这个网站以及其他许多网站,但似乎没有人给我最简单的答案。在下面的文章中,有两个不同的变量需要放入一个pickle(又名'test1'和'test2');但我完全无法得到两个中较简单的一个加载。没有错误消息或任何东西,它确实显示正在向pickle写入某些东西但是然后我关闭'program',重新打开它,尝试加载pickle但是'test1'的值不会改变。< / p>
第二个问题是如何将两者都保存到同一个泡菜中?起初我尝试使用allStuff变量来存储test1和test2,然后转储allStuff ...转储似乎是成功但加载确实是jack。香港专业教育学院尝试了一个变体,你列出了应该加载的每个文件,但这只是造成了很多错误,导致我攻击我可怜的旧键盘......
请帮助。
import pickle
class testing():
test1 = 1000
test2 = {'Dogs' : 0, 'Cats' : 0, 'Birds' : 0, 'Mive' : 0}
def saveload():
check = int(input(' 1. Save : 2. Load : 3. Print : 4. Add'))
allStuff = testing.test1, testing.test2
saveFile = 'TestingSaveLoad.data'
if check == 1:
f = open(saveFile, 'wb')
pickle.dump(testing.test1, f)
f.close()
print()
print('Saved.')
testing.saveload()
elif check == 2:
f = open(saveFile, 'rb')
pickle.load(f)
print()
print('Loaded.')
testing.saveload()
elif check == 3:
print(allStuff)
testing.saveload()
else:
testing.test1 += 234
testing.saveload()
testing.saveload()
答案 0 :(得分:1)
pickle.load
文档声明:
从打开的文件对象文件中读取一个pickle对象表示,然后返回在其中指定的重构对象层次结构。
所以你需要这样的东西:
testing.test1 = pickle.load(f)
但是,要保存和加载多个对象,可以使用
# to save
pickle.dump(allStuff, f)
# to load
allStuff = pickle.load(f)
testing.test1, testing.test2 = allStuff
答案 1 :(得分:1)
将它们转储为元组,加载时,将结果解压缩回两个变量。
pickle.dump((testing.test1,testing.test2), f)
和
testing.test1, testing.test2 = pickle.load(f)
然后更改打印件以打印这两个项目并忘记allStuff
,因为每次加载/重新分配时都必须不断更新allStuff
(取决于您要存储的项目类型)
print(testing.test1, testing.test2)
我还会删除对saveLoad()
的递归调用,并在while
循环中包含应该重复的内容以及退出选项
if check == 0:
break
答案 2 :(得分:1)
您目前没有保存重组的腌制对象。文档指出pickle.load()
返回重组对象。
你应该有类似的东西:
f = open(saveFile, 'rb')
testing.test1 = pickle.load(f)
要保存多个对象,请使用this answer中建议的方法:
如果您需要保存多个对象,只需将它们放在一个列表或元组
中即可
另外,我建议使用with
关键字打开文件。这将确保即使出现问题也能关闭文件。最终输出的一个例子:
with open(saveFile, 'wb') as f:
pickle.dump((testing1, testing2), f)
...
with open(saveFile, 'rb') as f:
testing1, testing2 = pickle.load(f) # Implicit unpacking of the tuple
您可能还需要while
循环而不是多次调用saveload()
- 它会更清晰一些。请注意,现在你没有办法退出循环,没有退出程序。