2008-11-12 11 views
5

Tengo una aplicación que importa datos de un archivo en escabeche. Funciona bien en Windows, pero el comportamiento de Mac y Linux es extraño.El archivo en escabeche no se carga en Mac/Linux

En OS X, el archivo conservado (extensión de archivo ".char") no está disponible como una selección a menos que establezca el tipo de archivo en *. *. Entonces, si selecciono un archivo que tiene la extensión .char, no va a cargar, dando el error

unpickle_file = cPickle.load(char_file) 

ValueError: could not convert string to float

Sin embargo, si se crea un archivo que no tiene la extensión .char, ese archivo Cargar bien.

En Linux, cuando utilizo el cuadro de diálogo "abrir archivo", mis archivos conservados no son visibles, tengan o no una extensión de archivo. Sin embargo, puedo verlos bajo Nautilus o Dolphin. Sin embargo, simplemente no existen para mi aplicación.


Editar Aquí está el código ahorrar:

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

Aquí está el código abierto:

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

¿Qué es un "archivo en escabeche"? –

+0

Un archivo que se ha creado utilizando el módulo pickle (http://docs.python.org/library/pickle.html#module-pickle), un módulo utilizado para serializar y deserializar estructuras de datos. –

Respuesta

10

Probablemente no se podía abrir el archivo en modo binario al escribir y/o leyendo los datos en escabeche. En este caso, se producirá la conversión de formato de nueva línea, que puede romper los datos binarios.

Para abrir un archivo en modo binario que tiene que ofrecer "b" como parte de la cadena modo:

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

No creo que esto ayude, ya que en el modo de texto de Linux es lo mismo que el binario de todos modos. Los \ r's ya están presentes, por lo que el problema realmente debería solucionarse al guardar (aunque la apertura en modo de nueva línea universal podría funcionar a su alrededor.) – Brian

+0

Ahora que se ha publicado la apertura, siéntase libre de cambiar "probablemente" a "definitivamente ". –

8

Como se ha mencionado por Adam, el problema es probable que sea el formato de nueva línea del archivo de salmuera .

Lamentablemente, el problema real se debe realmente a guardar en lugar de cargar. Esto puede ser recuperable si está utilizando encuadres de modo de texto, en lugar de binario. Intente abrir el archivo en modo de nueva línea universal, que hará que el pitón de adivinar lo que la derecha el fin de línea son por ejemplo:

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

Sin embargo, si usted está usando un formato binario (cPickle.dump (archivo, 1)) puede tener un pickle corrupto irrecuperable (incluso cuando se carga en Windows): si tiene suerte y no aparecen caracteres \ r \ n, entonces puede funcionar, pero tan pronto como esto ocurra, podría terminar con datos corruptos, como no hay forma de distinguir entre un código "real" \ r \ n y una ventana se ha insertado al ver simplemente \ n.

La mejor forma de manejar cosas para cargar en múltiples plataformas es guardarlas siempre en modo binario. En la máquina de las ventanas, al guardar el uso de la salmuera:

char_file = open('filename.char','wb') 
cPickle.dumps(data, char_file) 
2
self.file = open(self.file_name, 'w')

debe ser:

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

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

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

4

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 desaturación posterior.

0

Uso dos2unix herramienta

dos2unix pickle.char 
Cuestiones relacionadas