【问题标题】:Unable to load a list of classes using the pickle function in Python 3.7无法使用 Python 3.7 中的 pickle 函数加载类列表
【发布时间】:2019-03-25 09:19:00
【问题描述】:

我编写了一个脚本,将支出和收入的类实例存储在列表中。

第一次启动模块时,我使用 try/except 块来检查腌制文件:

try:
        #list definitions
        expenselist = pickle.load(open(filename,'rb'))
        incomelist = pickle.load(open(filename,'rb'))
except:
        print ("Generating new lists.")
        #list definitions
        expenselist = []
        incomelist = []

这在 IDLE 中运行时按预期工作: test-slide-1

程序打印有关生成新列表的调试消息并打印空白列表。然后它提示用户输入以创建附加到空列表的类实例。

enterValue = str(input("Hi, press 1 to enter income and 2 to expense"))

    try:
        if enterValue == '1':
            addIncome ()
            #printRev()#debug to print class
        elif enterValue == '2':
            addExpense ()
            #printExp() #debug to print class
        else:
            raise ValueError 
    except ValueError:
        print ("Incorrect Value.")

这会在 IDLE 中产生以下结果: test-slide-2

然后使用以下方法腌制:

#pickle expenselist
pickle.dump(expenselist,open(filename,'wb'))

#pickle incomelist
pickle.dump(incomelist,open(filename,'wb'))

腌制的数据存储在这里: file_structure

当我使用 Notepad++ 打开这个文件时,我得到了这个:

€]q。

所以我知道它存储了一些东西。

到目前为止,一切都按设计进行,但是当我再次运行脚本时,我得到: test-slide-3

我没有打印关于生成新列表的调试消息,所以我知道它检测到并尝试加载文件,但它打印的是空白列表,而不是我在上一次会话期间存储在列表中的数据。

我已经尝试了几个星期来弄清楚发生了什么。我最初认为它是保存类实例的位置而不是实例本身,但如果是这种情况,它应该打印实例的地址。相反,我得到的是空白列表。

我的问题是:1,无论加载泡菜,它是否都会生成新列表,我该如何停止它? 2,如果这不是问题,那是什么?

我大约有 50% 是自学成才的,而且我已经用尽了我所知道的资源。我让两个程序员看了一下代码,但都不是 Python 专家。所以这是我唯一没有尝试过的。

【问题讨论】:

  • 我相信您转储的incomelist 将覆盖您之前转储的expenselist,因为您使用w 标志重新打开同一个文件,根据文档将:@987654331 @。同样,您的load 语句会重新打开同一个文件,从而将文件重新设置到开头。
  • 所以我需要将列表存储在两个不同的文件中?
  • 不,只需打开文件一次,如@progmatico 提供的答案所示。

标签: python python-3.x persistence pickle


【解决方案1】:

Pickle 使用起来非常简单。我建议使用 with 语句,就像在@John Anderson 的评论中一样,看起来你正在覆盖一个文件。

使用示例:

import pickle

a = [1,2,3]
b = [4,5,6]
with open("pickle1.dat", 'wb') as f:
    pickle.dump(a, f)
    pickle.dump(b, f)

c = None
d = None
with open("pickle1.dat", 'rb') as f:
    c = pickle.load(f)
    d = pickle.load(f)

print(c)
print(d)

输出

[1,2,3]
[4,5,6]

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 2022-08-10
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多