【问题标题】:How can i save object with list using pickle in python?如何在python中使用pickle保存带有列表的对象?
【发布时间】:2018-10-17 18:53:14
【问题描述】:

我正在尝试使用另一个类对象的列表来保存对象。

    def loadBot(self, name):

       BotFile = open('../Bots/' + name, 'rb+')

       self.CurrentBot = pickle.load(BotFile)

       BotFile.close() # Closes file

    def saveBot(self, bot):

       BotFile = open('../Bots/' + bot.Name, 'wb+') 

       BotFile.truncate() # Clear File
       pickle.dump(bot, BotFile, protocol=pickle.HIGHEST_PROTOCOL) 

       BotFile.close() # Close file

这些是我用来加载对象和保存的函数。在对象 Bot 中,我有对象“蓝图”列表和函数添加蓝图。

    class ChatBot:

       Name = 'DefaultName'
       Token = 'DefaultToken'
       bot_blueprints = []

       def __init__(self, Name, Token):
         self.Name = Name
         self.Token = Token

      def addBlueprint(self):
        self.bot_blueprints.append(Blueprint(len(self.bot_blueprints))) 

我在保存之前和之后添加新元素并检查列表大小

app.loadBot('A')
print(len(app.CurrentBot.bot_blueprints))
app.CurrentBot.addBlueprint()
app.saveBot(app.CurrentBot)
print(len(app.CurrentBot.bot_blueprints))

它从 0 开始,添加 bp 后变为 1。在此之后我关闭应用程序,第二次启动它,我的代码应该在打开后写 1,在添加后写 2,但它仍然是 0 和 1。文件大小在增长,但泡菜可以'不正确地加载我的文件。

【问题讨论】:

    标签: python list class object pickle


    【解决方案1】:

    您编写代码bot_blueprints 的方式是一个类级别的变量,而不是一个实例级别的变量。因此整个程序中只有一个,而不是每个ChatBot

    我会重新安排课程,使其更像:

    class ChatBot:
       def __init__(self, name, token):
         self.name = name
         self.token = token
         self.bot_blueprints = []
    
      def addBlueprint(self):
        self.bot_blueprints.append(Blueprint(len(self.bot_blueprints))) 
    

    【讨论】:

    • 没有问题,很高兴它有帮助!如果这解决了您的问题,您可以将此答案标记为“已接受”
    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多