El archivo encurtido no se carga en Mac / Linux

Tengo una aplicación que importa datos de un archivo encurtido. Funciona bien en Windows, pero el comportamiento de Mac y Linux es extraño.

En OS X, el archivo encurtido (extensión de archivo “.char”) no está disponible como selección a menos que establezca el tipo de archivo en *. *. Luego, si selecciono un archivo que tiene la extensión .char, no se cargará, dando el error

unpickle_file = cPickle.load(char_file) 

ValueError: no se pudo convertir la cadena a flotar

Sin embargo, si creo un archivo que no tiene la extensión .char, ese archivo se cargará bien.

En Linux, cuando uso el cuadro de diálogo “abrir archivo”, mis archivos decapados no son visibles, tengan o no una extensión de archivo. Sin embargo, puedo verlos debajo de Nautilus o Dolphin. Aunque simplemente no existen para mi aplicación.


Editar Aquí está el código de guardado:

 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,  self.charAttribs.char_skills_dict) self.file = open(self.file_name, 'w') cPickle.dump(self.save_data, self.file) self.file.close() 

Aquí está el código abierto:

  def getCharFile(self, event): # wxGlade: CharSheet. """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() 

Probablemente no abrió el archivo en modo binario al escribir y / o leer los datos encurtidos. En este caso se producirá una conversión de formato de nueva línea, que puede romper los datos binarios.

Para abrir un archivo en modo binario, debe proporcionar “b” como parte de la cadena de modo:

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

Como mencionó Adam , es probable que el problema sea el formato de nueva línea del archivo pickle.

Desafortunadamente, el problema real en realidad se produce al guardar en lugar de cargar. Esto puede ser recuperable si está utilizando pepinillos en modo texto, en lugar de binarios. Intenta abrir el archivo en el modo de nueva línea universal, lo que hará que Python adivine cuáles son los finales de línea correctos, es decir:

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

Sin embargo, si está utilizando un formato binario (cPickle.dump (archivo, 1)), es posible que tenga un pickle dañado de forma irrecuperable (incluso al cargar en Windows): si tiene suerte y no aparecen caracteres \ r \ n puede funcionar, pero tan pronto como esto ocurra, podría terminar con datos corruptos, ya que no hay manera de distinguir entre un código \ r \ n “real” y una ventana insertada al ver solo \ n.

La mejor manera de manejar las cosas que se cargarán en múltiples plataformas es guardar siempre en modo binario. En su máquina de windows, al guardar el pickle use:

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

Otra forma de obtener este error es olvidarse de cerrar el archivo de salida después del decapado. Esto puede dejar un archivo incompleto que falla de manera aleatoria durante la eliminación posterior de la selección.

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

Debiera ser:

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

En su función createSaveFile , para guardar el archivo en modo binario (en lugar de en modo texto). También debe asegurarse de abrir el archivo en modo binario también (rb).

Si no usa el modo binario, Windows convertirá todas las líneas nuevas a \ r \ n y dañará el archivo de manera efectiva (al menos en lo que respecta a otros sistemas operativos).

Utilizar la herramienta dos2unix.

 dos2unix pickle.char