python open - Comment écrire UTF-8 dans un fichier CSV




file in (6)

J'essaie de créer un fichier texte au format csv à partir d'un QTableWidget 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 essayé aussi avec

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

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


Answers

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

(ne peut pas copier le code ici parce qu'il est protégé par copyright)


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

Par exemple:

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

fonctionne, alors que:

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

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

Comme UnicodeWriter s'attend évidemment à ce que toutes les valeurs des colonnes soient des chaînes, 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 singulier csv_writer pour ajouter une fonction write_utf8_row - l'exercice est laissé au lecteur.


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



De votre course de shell:

pip2 install unicodecsv

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


Une alternative:

% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z1=dict(x.items() + y.items())'
100000 loops, best of 3: 5.67 usec per loop
% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z2=dict(x, **y)' 
100000 loops, best of 3: 1.53 usec per loop




python csv encoding utf-8 pyqt4