2013-09-03 3 views
1

Je perds la tête ici. J'ai lu et essayé tellement de choses que je suis totalement perdu. Je n'utilise pas habituellement Python, et j'essaye de mettre à jour un code. Avant, les fichiers csv ne contenaient aucun caractère spécial (comme "é" ...) et maintenant c'est le cas. Le code réel renvoie l'exception UnicodeEncodeError:Ouvrir le fichier csv dans utf-8 avec Python

try: 
     self.FichierE = codecs.open(self.CheminFichierE,"r", "utf-8") 
     self.ReaderFichierE = csv.reader(self.FichierE, delimiter=';') 
    except IOError: 
     self.TextCtrl.AppendText(u"Fichier E n'a pas été trouvé") 
     return 

try: 
     DataFichierE = [ligne for ligne in self.ReaderFichierE] 
    except UnicodeDecodeError: 
     self.TextCtrl.AppendText(self.NomFichierE+ u" n'est pas lisible") 
     return 
    except UnicodeEncodeError: 
     self.TextCtrl.AppendText(self.NomFichierE+ u" n'est pas lisible (ASCII)") 
     return 

J'ai essayé tant de choses, je vais mettre la dernière chose que je l'ai fait (et que je pensais que cela devrait fonctionner):

try: 
     DataFichierE = [] 
     for utf8_row in self.ReaderFichierE: 
      unicode_row = [x.decode('utf8') for x in utf8_row] 
      DataFichierE.append(unicode_row) 
    except UnicodeDecodeError: 
     self.TextCtrl.AppendText(self.NomFichierE+ u" n'est pas lisible") 
     return 
    except UnicodeEncodeError: 
     self.TextCtrl.AppendText(self.NomFichierE+ u" n'est pas lisible (ASCII)") 
     return 

Toute aide sera grandement appréciée!

Répondre

1

Vous pouvez essayer d'utiliser pandas.

import pandas 
myfile = open('myfile.csv') 
data = pandas.read_csv(myfile, encoding='utf-8', quotechar='"', delimiter=';') 
print(data.values) 

ou unicodecsv

import unicodecsv 
myfile = open('myfile.csv') 
data = unicodecsv.reader(myfile, encoding='utf-8', delimiter=';') 
for row in data:             
    print row 

Vous pouvez être en mesure de les installer à l'aide de pépin:

pépin installer pandas géants

pip installer unicodecsv

En fonction de vos besoins que vous pourriez essayez également des opérations de chaîne simples:

data = [line.strip().split(';') for i, line in enumerate(open('./foo.csv').readlines()) if i != 0] 

Mise à jour Vous pouvez également essayer de remplacer les caractères unicode avec des équivalents ASCII:

from StringIO import StringIO 
import codecs 
import unicodedata 

... 

    try: 
     self.FichierE = StringIO(
      unicodedata.normalize(
       'NFKD', codecs.open(self.CheminFichierE, "r", "utf-8").read() 
      ).encode('ascii', 'ignore')) 
     self.ReaderFichierE = csv.reader(self.FichierE, delimiter=';') 

    except IOError: 
     self.TextCtrl.AppendText(u"Fichier E n'a pas été trouvé") 
     return 

    try: 
     DataFichierE = [ligne for ligne in self.ReaderFichierE] 
    except UnicodeDecodeError: 
     self.TextCtrl.AppendText(self.NomFichierE+ u" n'est pas lisible") 
     return 
    except UnicodeEncodeError: 
     self.TextCtrl.AppendText(self.NomFichierE+ u" n'est pas lisible (ASCII)") 
     return 
Questions connexes