我有一个从腌制文件中导入数据的应用程序。它在Windows中可以正常工作,但Mac和Linux的行为很奇怪。
在OS X中,除非将文件类型设置为。,否则腌制的文件(文件扩展名“ .char”)不可用。然后,如果我选择一个扩展名为.char的文件,它将无法加载,并显示错误消息
unpickle_file = cPickle.load(char_file) ValueError:无法将字符串转换为浮点型
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()
写入和/或读取腌制的数据时,可能没有以二进制模式打开文件。在这种情况下,将进行换行格式转换,这可能会破坏二进制数据。
要以二进制模式打开文件,您必须在模式字符串中提供“ b”:
char_file = open('pickle.char', 'rb')