reconoce - ejecutar python en linux
El archivo en escabeche no se cargará en Mac/Linux (5)
Probablemente no haya abierto el archivo en modo binario al escribir y / o leer 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, debe proporcionar "b" como parte de la cadena de modo:
char_file = open(''pickle.char'', ''rb'')
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 conservado en vinagre (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 se cargará, dando el error
unpickle_file = cPickle.load(char_file)
ValueError: no se pudo convertir cadena en flotación
Sin embargo, si creo un archivo que no tiene la extensión .char, ese archivo se cargará muy bien.
En Linux, cuando uso 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 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,
<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()
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 modo de 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 en / r / n y efectivamente dañará el archivo (al menos en lo que respecta a otros sistemas operativos).
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.
Use la herramienta dos2unix
dos2unix pickle.char
Como lo mencionó Adam , es probable que el problema sea el formato de nueva línea del archivo de pickle.
Desafortunadamente, el problema real en realidad se debe al guardado en lugar de a la carga. Esto puede ser recuperable si está utilizando encuadres de modo de texto, en lugar de binario. Intenta abrir el archivo en el modo de línea nueva 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)), puede tener un pickle corrupto irrecuperable (incluso cuando lo 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 dañados, ya que no hay forma de distinguir entre un código "real" y el que Windows ha insertado al ver solo / n.
La mejor forma de manejar cosas para cargar en múltiples plataformas es guardarlas siempre en modo binario. En su máquina de Windows, cuando guarde la salmuera use:
char_file = open(''filename.char'',''wb'')
cPickle.dumps(data, char_file)