102 votes

Comment écrire UTF-8 dans un fichier CSV

J'essaie de créer un fichier texte au format csv à partir d'un fichier PyQt4. QTableWidget . Je veux écrire le texte avec un encodage UTF-8 car il contient des caractères spéciaux. J'utilise le code suivant :

import codecs
...
myfile = codecs.open(filename, 'w','utf-8')
...
f = result.table.item(i,c).text()
myfile.write(f+";")

Cela fonctionne jusqu'à ce que la cellule contienne un caractère spécial. J'ai également essayé avec

myfile = open(filename, 'w')
...
f = unicode(result.table.item(i,c).text(), "utf-8")

Mais il s'arrête également lorsqu'un caractère spécial apparaît. Je n'ai aucune idée de ce que je fais de mal.

128voto

Zanon Points 13171

C'est très simple pour Python 3.x ( docs ).

import csv

with open('output_file_name', 'w', newline='', encoding='utf-8') as csv_file:
    writer = csv.writer(csv_file, delimiter=';')
    writer.writerow('my_utf8_string')

Pour Python 2.x, regardez aquí .

106voto

Kasper Souren Points 1029

Depuis votre shell, exécutez :

pip2 install unicodecsv

Et (contrairement à la question d'origine) en supposant que vous utilisez le module intégré de Python csv module, tourner
import csv en
import unicodecsv as csv dans votre code.

14voto

Gijs Points 3952

Utilisez ce paquet, il fonctionne tout simplement : https://github.com/jdunck/python-unicodecsv .

6voto

Bojan Bogdanovic Points 401

Pour moi, le UnicodeWriter de la documentation du module CSV de Python 2 n'a pas vraiment fonctionné, car elle casse la classe csv.writer.write_row() interface.

Par exemple :

csv_writer = csv.writer(csv_file)
row = ['The meaning', 42]
csv_writer.writerow(row)

fonctionne, tandis que :

csv_writer = UnicodeWriter(csv_file)
row = ['The meaning', 42]
csv_writer.writerow(row)

jettera AttributeError: 'int' object has no attribute 'encode' .

Comme UnicodeWriter s'attend évidemment à ce que toutes les valeurs des colonnes soient des chaînes de caractères, nous pouvons convertir les valeurs nous-mêmes et utiliser simplement le module CSV par défaut :

def to_utf8(lst):
    return [unicode(elem).encode('utf-8') for elem in lst]

...
csv_writer.writerow(to_utf8(row))

Ou nous pouvons même modifier csv_writer pour ajouter une fonction write_utf8_row fonction - l'exercice est laissé au lecteur.

2voto

Aaron Digulla Points 143830

Les exemples de la documentation Python montrent comment écrire des fichiers CSV Unicode : http://docs.python.org/2/library/csv.html#examples

(on ne peut pas copier le code ici car il est protégé par le droit d'auteur)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X