Pickled文件不会加载到Mac/Linux上

2024-04-29 10:55:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从pickle文件导入数据的应用程序。它在Windows下运行得很好,但是Mac和Linux的行为很奇怪。

在OSX中,pickled文件(文件扩展名“.char”)不可用作选择,除非我将文件类型设置为*.*。然后,如果我选择一个扩展名为.char的文件,它将不会加载,并给出错误

unpickle_file = cPickle.load(char_file) 

ValueError: could not convert string to float

但是,如果我创建了一个没有.char扩展名的文件,那么该文件将很好地加载。

在Linux中,当我使用“文件打开”对话框时,我的pickled文件不可见,无论它们是否具有文件扩展名。不过,我可以在鹦鹉螺或海豚下面看到它们。不过,我的应用程序根本不存在它们。


编辑下面是保存代码:

def createSaveFile(self):
        """Create the data files to be saved and save them.

        Creates a tuple comprised of a dictionary of general character information
        and the character's skills dictionary."""
        if self.file_name:
            self.save_data = ({'Name':self.charAttribs.name,

              <snip> 

                self.charAttribs.char_skills_dict)
            self.file = open(self.file_name, 'w')
            cPickle.dump(self.save_data, self.file)
        self.file.close()

以下是开放代码:

 def getCharFile(self, event): # wxGlade: CharSheet.<event_handler>
        """Retrieve pickled character file from disk."""
        wildcard = "Character files (*.char) | *.char | All files (*.*) | *.*"        
        openDialog = wx.FileDialog(None, "Choose a character file", os.getcwd(),
        "", wildcard, wx.OPEN | wx.CHANGE_DIR)
        if openDialog.ShowModal() == wx.ID_OK:
            self.path = openDialog.GetPath()
        try:
            char_file =  open(self.path, "r")
            unpickle_file = cPickle.load(char_file)
            char_data, char_skills = unpickle_file
            self.displayCharacter(char_data, char_skills)
        except IOError:
            self.importError = wx.MessageDialog(self, 
            "The character file is not available!",
            "Character Import Error", wx.OK | wx.ICON_ERROR)
            self.importError.ShowModal()
            self.importError.Destroy()
            openDialog.Destroy()

Tags: 文件nameselfdatasavefilesskillsfile
3条回答

在写入和/或读取pickled数据时,可能没有以二进制模式打开文件。在这种情况下,会发生换行格式转换,这会破坏二进制数据。

要以二进制模式打开文件,必须提供“b”作为模式字符串的一部分:

char_file = open('pickle.char', 'rb')

获取此错误的另一种方法是在pickle之后忘记关闭输出文件。这可能会留下一个不完整的文件,该文件在随后的取消拾取期间以随机方式失败。

正如Adam所提到的,问题可能是pickle文件的换行格式。

不幸的是,真正的问题实际上是由save而不是load引起的。如果您使用的是文本模式pickle,而不是二进制模式,则这可能是可以恢复的。尝试以通用换行模式打开文件,这将导致python猜测正确的行尾是什么,即:

char_file=open('filename.char','rU')

但是,如果您使用的是二进制格式(cPickle.dump(file,1))则可能有一个无法恢复的损坏pickle(即使在Windows中加载时也是如此)-如果您很幸运并且没有显示字符,则可能会正常工作,但一旦发生这种情况,您可能会得到损坏的数据,因为无法区分“真实的”代码和一个窗口插入的“仅查看”代码

处理要在多个平台中加载的内容的最佳方法是始终以二进制模式保存。在windows计算机上,保存pickle时使用:

char_file = open('filename.char','wb')
cPickle.dumps(data, char_file)

相关问题 更多 >