【问题标题】:Errors with pickling objects酸洗对象的错误
【发布时间】:2018-03-19 21:34:17
【问题描述】:

我们正在使用 pickle 进行练习,但此代码无法正常工作,请帮助我,这是代码(有些单词是西班牙语,因为我来自美国):

    import pickle

class persona:

    def __init__(self, nombre, genero, edad):
        self.nombre = nombre
        self.genero = genero
        self.edad = edad
        print("se ha creado una persona nueva con el nombre de: ", self.nombre)

    def __str__(self):
        return "{} {} {}".format(self.nombre, self.genero, self.edad)

class listaPersonas:

    personas = []

    def __init__(self):
        listaDePersonas = open("ficheroExterno", "ab+")
        listaDePersonas.seek(0)

        try:
            self.personas = pickle.load(listaDePersonas)
            print("Se cargaron {} personas del fichero externo".format(len(self.personas)))
        except:
            print("El fichero está vacío")

        finally:
            listaDePersonas.close()
            del(listaDePersonas)

    def agregarPersonas(self, p):
        self.personas.append(p)
        self.guardarPersonasEnFicheroExterno()

    def mostrarPersonas(self):
        for p in self.personas:
            print(p)

    def guardarPersonasEnFicheroExterno(self):
        listaDePersonas = open("ficheroExterno", "wb")
        pickle.dump(self.personas, listaDePersonas)
        listaDePersonas.close()
        del(listaDePersonas)

    def mostrarInfoFicheroExterno(self):
        print("La información sle fichero externo es la siguiente: ")
        for p in self.personas:
            print(p)


miLista = listaPersonas()
persona = persona("Sandra", "Femenino", 29)
miLista.agregarPersonas(persona)
miLista.mostrarInfoFicheroExterno()

它会抛出:

    El fichero está vacío
se ha creado una persona nueva con el nombre de:  Sandra
Traceback (most recent call last):
  File "Guardado_permanente.py", line 54, in <module>
    miLista.agregarPersonas(persona)
  File "Guardado_permanente.py", line 34, in agregarPersonas
    self.guardarPersonasEnFicheroExterno()
  File "Guardado_permanente.py", line 42, in guardarPersonasEnFicheroExterno
    pickle.dump(self.personas, listaDePersonas)
_pickle.PicklingError: Can't pickle <class '__main__.persona'>: it's not the same object as __main__.persona

***Repl Closed***

我有大约 1 1/2 小时看到此代码,我试图猜测问题出在哪里,但该代码与我老师的代码相同。请帮我。我正在使用 Sublime 文本进行编码。

【问题讨论】:

  • 请想出一个更好的问题标题;大量代码不起作用,并且您是学生并不真正相关。你的问题相当不错(它有正确的错误输出是完整的,你的标题让你失望了。

标签: python pickle


【解决方案1】:

在这一行中,您已将您的类 persona 替换为该类的一个实例:

persona = persona("Sandra", "Femenino", 29)

pickle 正在尝试查找 persona 的类定义,但找不到,因为它已经没有名称了。

不要尝试在两件事上使用相同的名称;只有最后的分配计数。 Standard style 是为类使用 CamelCase 名称,因此您可以将您的类命名为 Persona

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2010-12-30
    • 2011-10-06
    相关资源
    最近更新 更多