2016-03-21 3 views
-2

Communauté Hello StackOverflow. Je suis un utilisateur assez récent de Python, donc désolé d'avance pour l'absurdité de cette question! Mais j'ai essayé de le réparer pendant des heures mais je ne l'ai toujours pas compris. J'essaie d'importer un grand ensemble de données pour le manipuler en Python.Problème sur les données codées Unicode en Python

Cet ensemble de données est en .csv et j'ai eu des problèmes pour le lire en raison de problèmes d'encodage.

J'ai essayé de le coder dans le texte UTF-8 avec notepad ++ J'ai essayé le module csv.reader en Python

Voici un exemple de mon code:

import csv 
with open('twitter_test_python.csv') as csvfile: 
    #for file5 in csvfile: 
    # file5.readline() 
    #csvfile = csvfile.encode('utf-8') 
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|') 
    for row in spamreader: 
     row = " ".join(row) 
     row2= str.split(row) 
    listsw = [] 
    for mots in row2: 
     if mots not in sw: 
      del mots 
    print row2 

Mais quand je Importer mes données en Python J'ai toujours des problèmes d'encodage (accents, etc) que j'utilise.

Comment puis-je coder mes données pour qu'elles soient lisibles correctement avec Python?

Merci!

+0

* J'ai toujours des problèmes d'encodage * signifie exactement rien! Dites ce qui se passe exactement et ce qui est attendu. –

+0

Voici un exemple d'une liste de mes données: ["En vrai j'en ai marre j'ai une poste \ xe0 3min de chez moi et le postier il xc9cide de mettre mon colis dans une poste que je connais pas "]. –

+0

Je veux avoir ceci: [En vrai j'en ai marre j'ai posté à 3min de chez moi et le postier il a décidé de mettre mon colis dans une poste que je connais pas] –

Répondre

0

module csv documentation fournit un exemple de la façon de traiter unicode:

import csv,codecs,cStringIO 

class UTF8Recoder: 
    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 
    def __iter__(self): 
     return self 
    def next(self): 
     return self.reader.next().encode("utf-8") 

class UnicodeReader: 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 
    def next(self): 
     '''next() -> unicode 
     This function reads and returns the next line as a Unicode string. 
     ''' 
     row = self.reader.next() 
     return [unicode(s, "utf-8") for s in row] 
    def __iter__(self): 
     return self 

class UnicodeWriter: 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds): 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 
    def writerow(self, row): 
     '''writerow(unicode) -> None 
     This function takes a Unicode string and encodes it to the output. 
     ''' 
     self.writer.writerow([s.encode("utf-8") for s in row]) 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     data = self.encoder.encode(data) 
     self.stream.write(data) 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

with open('twitter_test_python.csv','rb') as spamreader: 
    reader = UnicodeReader(fin) 
    for line in reader: 
     #do stuff 
     print line 
0

Alexey Smirnov's answer est élégant mais peut-être un peu compliqué pour un débutant. Alors laissez-moi donner un exemple plus proche du code dans la question. Lorsque vous lisez des fichiers avec Python 2, vous obtenez le contenu str, pas unicode. Probablement vous voulez le convertir dès que possible. Toutefois, le documentation of the csv module indique "Cette version du module csv ne prend pas en charge l'entrée Unicode." Donc, vous devriez encoder la sortie de csv.reader, pas l'entrée. Insertion dans vos résultats de code dans:

import csv 
with open('twitter_test_python.csv') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|')) 
    for row in spamreader: 
     row = " ".join(row) 
     row = unicode(row, encoding="utf-8") 
     row2 = row.split() 

Cependant, vous voudrez peut-être examiner si les cellules se joindre juste pour les séparer est à nouveau vraiment ce que vous voulez. Sans cela, le code ressemblerait à suivre. Le résultat est différent si les éléments de la liste contiennent des espaces.

import csv 
with open('twitter_test_python.csv') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=str(','), quotechar=str('|')) 
    for row in spamreader: 
     row2 = list(unicode(cell, encoding="utf-8") for cell in row) 

Si vous voulez écrire quelque chose à un fichier que vous devez convertir le unicode premier retour à un str comme unicode.encode("utf-8").

+0

Merci pour la réponse. Cela signifie donc que je peux travailler avec les données même si elles ne sont pas belles en Python? –

+0

Oui, vous pouvez traiter unicode avec python. Compte tenu de vos nouveaux commentaires, je suppose que vous faites référence à la sortie de 'print'. Vous pourriez être intéressé par les différences de ['str()' vs 'repr()'] (http://stackoverflow.com/questions/19331404/str-vs-repr-functions-in-python-2-7- 5). 'print' utilise la représentation' str'. Une 'list' utilise pour sa représentation' str' la représentation 'repr' de ses éléments. Pour obtenir la sortie désirée, utilisez 'print" ["+", ".join (row2) +"] "'. – jakun