2008-11-12 8 views
5

J'ai une application qui importe des données à partir d'un fichier décapé. Cela fonctionne très bien dans Windows mais le comportement de Mac et Linux est impair.Le fichier décapé ne se charge pas sous Mac/Linux

Sous OS X, le fichier décapé (extension de fichier ".char") n'est pas disponible en tant que sélection à moins que je ne mette le type de fichier à *. *. Ensuite, si je sélectionne un fichier qui a l'extension .char, il ne se charge pas, en donnant l'erreur

unpickle_file = cPickle.load(char_file) 

ValueError: could not convert string to float

Cependant, si je crée un fichier qui ne porte pas l'extension de .char, ce fichier sera charger très bien. Sous Linux, lorsque j'utilise la boîte de dialogue "Fichier ouvert", mes fichiers décapés ne sont pas visibles, qu'ils aient ou non une extension de fichier. Cependant, je peux les voir sous Nautilus ou Dolphin. Ils n'existent tout simplement pas pour mon application.


Modifier Voici la sauvegarde du code:

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

Voici le code ouvert:

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'est-ce qu'un "fichier décapés"? –

+0

Un fichier créé à l'aide du module pickle (http://docs.python.org/library/pickle.html#module-pickle), un module utilisé pour sérialiser et désérialiser les structures de données. –

Répondre

10

Probablement vous ne pas ouvrir le fichier en mode binaire lors de l'écriture et/ou lire les données marinés. Dans ce cas, la conversion du format de ligne se produira, ce qui peut casser les données binaires.

Pour ouvrir un fichier en mode binaire, vous devez fournir « b » dans le cadre de la chaîne de mode:

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

Je ne pense pas que cela aidera, car en mode texte linux est le même que binaire de toute façon. Les \ r sont déjà présents, donc le problème devrait vraiment être fixé lors de la sauvegarde (bien que l'ouverture en mode newline universel puisse contourner le problème.) – Brian

+0

Maintenant que l'ouverture a été affichée, n'hésitez pas à changer "probablement" en "définitivement". ". –

8

Comme mentionné par Adam, le problème est susceptible d'être le format de retour à la ligne du fichier de conserves au vinaigre .

Malheureusement, le vrai problème est réellement causé par enregistrer plutôt que de charger. Cela peut être récupérable si vous utilisez des pickles en mode texte, plutôt que binaire. Essayez d'ouvrir le fichier en mode universel saut de ligne, ce qui provoquera python de deviner ce que les fins de ligne droite sont à savoir:

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

Cependant, si vous utilisez un format binaire (cPickle.dump (fichier, 1)) vous pouvez avoir un pickle irrécupérable corrompu (même en chargeant dans Windows) - si vous êtes chanceux et aucun \ r \ n caractères n'apparaissent alors cela peut fonctionner, mais dès que cela se produit vous pourriez vous retrouver avec des données corrompues, comme il n'y a aucun moyen de faire la distinction entre un "vrai" code \ r \ n et une fenêtre insérée en voyant juste \ n.

La meilleure façon de gérer les éléments à charger sur plusieurs plates-formes est de toujours enregistrer en mode binaire. Sur votre machine Windows, lors de l'enregistrement de l'utilisation de conserves au vinaigre:

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

devrait être:

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

Dans votre fonction createSaveFile, pour enregistrer le fichier en mode binaire (plutôt que le mode texte). Vous devriez également vous assurer d'ouvrir le fichier en mode binaire (rb).Si vous n'utilisez pas le mode binaire, Windows convertira toutes les nouvelles lignes en \ r \ n et corrompra effectivement le fichier (au moins pour les autres systèmes d'exploitation).

4

Une autre façon d'obtenir cette erreur est d'oublier de fermer le fichier de sortie après le décapage. Cela peut laisser un fichier incomplet qui échoue de manière aléatoire au cours du dépilage ultérieur.

0

Utilisez l'outil dos2unix

dos2unix pickle.char 
Questions connexes