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.
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.
Utilisez ce paquet, ça marche: https://github.com/jdunck/python-unicodecsv .
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)
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.
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