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

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

在OS X中,除非将文件types设置为*。*,否则腌制文件(文件扩展名“.char”)不可用作选区。 然后,如果我select具有.char扩展名的文件,它将不会加载,并提供错误

unpickle_file = cPickle.load(char_file) 

ValueError:无法将string转换为浮点数

但是,如果我创build一个没有.char扩展名的文件,该文件将加载得很好。

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


编辑这里是保存代码:

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

Solutions Collecting From Web of "Pickled文件不会在Mac / Linux上加载"

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

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

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

正如亚当所说,这个问题很可能是pickle文件的换行格式。

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

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

但是,如果你使用的是二进制格式(cPickle.dump(file,1)),你可能会有一个无法恢复的腌制(即使在Windows中加载时) – 如果幸运的话,没有\ r \ n字符出现,它可能会工作,但一旦发生这种情况,最终可能会导致数据损坏,因为无法区分“真实”的\ r \ n代码,并且只能看到一个窗口。

处理要在多个平台上加载的东西的最佳方法是始终以二进制模式保存。 在你的Windows机器上,当保存泡菜使用:

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

另一种解决这个错误的方法是在酸洗后忘记关闭输出文件。 这可能会留下一个不完整的文件,在随后的拆除过程中以随机的方式失败。

 self.file = open(self.file_name, 'w') 

应该:

 self.file = open(self.file_name, 'wb') 

在您的createSaveFile函数中,以二进制模式(而不是文本模式)保存文件。 您还应该确保以二进制模式打开文件(rb)。

如果你不使用二进制模式,那么Windows会将所有新行转换为\ r \ n,并且会有效地破坏文件(至少就其他操作系统而言)。

使用dos2unix工具

 dos2unix pickle.char