web-dev-qa-db-fra.com

Comment écrire UTF-8 dans un fichier CSV

J'essaie de créer un fichier texte au format CSV à partir d'un PyQt4 QTableWidget. Je veux écrire le texte avec un codage 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 essayé aussi avec

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

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

69
Martin

Depuis votre Shell:

pip2 install unicodecsv

Et (contrairement à la question initiale), si vous utilisez le module csv intégré de Python, tournez 
import csv dans 
import unicodecsv as csv dans votre code.

90
guaka

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 ici .

52
Zanon

Utilisez ce paquet, ça marche: https://github.com/jdunck/python-unicodecsv

14
Gijs

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

(impossible de copier le code ici car il est protégé par le droit d'auteur)

2
Aaron Digulla

Pour moi, la classe UnicodeWriter de la documentation du module CSV de Python 2 ne fonctionnait pas vraiment car elle cassait l'interface csv.writer.write_row().

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 à ce que toutes les valeurs de colonne soient des chaînes, nous pouvons les convertir 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 utiliser ckey_writer pour ajouter une fonction write_utf8_row - l'exercice est laissé au lecteur.

2
Bojan Bogdanovic

Pour python2 , vous pouvez utiliser ce code avant csv_writer.writerows(rows)
Ce code NE convertira PAS les entiers en chaînes utf-8

 def encode_rows_to_utf8 (rows): 
 encoded_rows = [] 
 pour rangée en rangée: 
 encoded_row = [] 
 pour la valeur dans la ligne: 
 si estinstance (valeur, chaîne de base): 
 valeur = unicode (valeur) .encode ("utf-8") 
 encoded_row.append (valeur) 
 encoded_rows.append (encoded_row) 
 retourne encoded_rows 
0
pymen