Créer un utf-8 fichier csv en Python
Je ne peux pas créer un utf-8 fichier csv en Python.
Je suis en train de le lire c'est docs, et dans le les exemples de la section, il dit:
Pour tous les autres codages suivants
UnicodeReader et UnicodeWriter
les classes peuvent être utilisées. Ils prennent un
supplémentaires paramètre d'encodage dans leur
constructeur et assurez-vous que le
les données sont transmises à la vraie lecture ou d'écriture
codé en UTF-8:
Ok. J'ai donc ce code:
values = (unicode("Ñ", "utf-8"), unicode("é", "utf-8"))
f = codecs.open('eggs.csv', 'w', encoding="utf-8")
writer = UnicodeWriter(f)
writer.writerow(values)
Et je reçois cette erreur:
line 159, in writerow
self.stream.write(data)
File "/usr/lib/python2.6/codecs.py", line 686, in write
return self.writer.write(data)
File "/usr/lib/python2.6/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 22: ordinal not in range(128)
Quelqu'un peut-il me donner un peu afin que je puisse comprendre ce que l'enfer je fais mal depuis que j'ai mis tous le codage de partout avant d'appeler UnicodeWriter classe?
class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
# Redirect output to a queue
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):
self.writer.writerow([s.encode("utf-8") for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode("utf-8")
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)
def writerows(self, rows):
for row in rows:
self.writerow(row)
- Il parlent de problème de codecs.ouvert. Lorsque je le supprime et il suffit d'utiliser ouverte, il fonctionne. Pourquoi?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas à utiliser
codecs.open
;UnicodeWriter
prend de saisie Unicode et prend en charge l'encodage tout en UTF-8. LorsqueUnicodeWriter
écrit dans le descripteur de fichier que vous avez passé pour elle, tout est déjà en UTF-8 (donc il fonctionne avec un fichier normal vous avez ouvert avecopen
).En utilisant
codecs.open
, vous avez essentiellement de convertir vos objets Unicode UTF-8 chaînes enUnicodeWriter
, puis essayer de le ré-encoder ces chaînes de caractères en UTF-8, comme si ces mots contenaient des chaînes Unicode, ce qui, évidemment, ne parvient pas.codecs.open
: "Ouvrir un fichier encodé en utilisant le mode et le retour d'une version conditionnée rendre transparent l'encodage/décodage.". En d'autres termes, si vous ouvrez un fichier pour écriture aveccodecs.open
, il fera de manière transparente coder tout ce que vous écrivez pour l'UTF-8 en premier.Comme vous l'avez compris, il fonctionne si vous utilisez plaine ouverte.
La raison pour cela est que vous avez essayé d'encoder en UTF-8 à deux reprises. Une fois dans
et puis plus tard dans UnicodeWriter.writeRow
Pour vérifier que cela fonctionne, utilisez votre code d'origine et outcomment cette ligne.
Greetz
J'ai couru dans le csv /unicode défi un temps, et jeté sur bitbucket: http://bitbucket.org/famousactress/dude_csv .. pourrait travailler pour vous, si vos besoins sont simples 🙂
Vous n'avez pas besoin de "double-encoder" tout ce.
Votre application devrait fonctionner entièrement en Unicode.
Faire votre encodage dans le
codecs.open
d'écrire des octets UTF-8 vers un fichier externe. Ne pas faire de l'encodage au sein de votre application.