一尘不染

腌制的文件不会在Mac / Linux上加载

linux

我有一个从腌制文件中导入数据的应用程序。它在Windows中可以正常工作,但Mac和Linux的行为很奇怪。

在OS X中,除非将文件类型设置为,否则腌制的文件(文件扩展名“
.char”)不可用。然后,如果我选择一个扩展名为.char的文件,它将无法加载,并显示错误消息

unpickle_file = cPickle.load(char_file)

ValueError:无法将字符串转换为浮点型

但是,如果我创建的文件没有.char扩展名,则该文件将正常加载。

在Linux中,当我使用“文件打开”对话框时,无论它们是否具有文件扩展名,我的腌制文件都不可见。但是,我可以在Nautilus或Dolphin下看到它们。但是,它们根本不存在于我的应用程序中。


编辑 这是保存代码:

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()

阅读 283

收藏
2020-06-03

共1个答案

一尘不染

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

要以二进制模式打开文件,您必须在模式字符串中提供“ b”:

char_file = open('pickle.char', 'rb')
2020-06-03