read - write python file utf8




Comment écrire UTF-8 dans un fichier CSV (4)

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 .

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.


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.


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.


Un hack très simple consiste à utiliser l'importation json au lieu de csv. Par exemple, au lieu de csv.writer, procédez comme suit:

    fd = codecs.open(tempfilename, 'wb', 'utf-8')  
    for c in whatever :
        fd.write( json.dumps(c) [1:-1] )   # json dumps writes ["a",..]
        fd.write('\n')
    fd.close()

Fondamentalement, compte tenu de la liste des champs dans le bon ordre, la chaîne formatée json est identique à une ligne csv à l'exception de [et] au début et à la fin respectivement. Et json semble être robuste à utf-8 en python 2. *





pyqt4