在腌菜中腌制

时间:2013-09-03 15:40:45

标签: python pickle

我已经浏览了这个网站以及其他许多网站,但似乎没有人给我最简单的答案。在下面的文章中,有两个不同的变量需要放入一个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()

3 个答案:

答案 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() - 它会更清晰一些。请注意,现在你没有办法退出循环,没有退出程序。