it-swarm.com.de

So schreiben Sie UTF-8 in eine CSV-Datei

Ich versuche eine Textdatei im csv-Format aus einer PyQt4 QTableWidget zu erstellen. Ich möchte den Text mit einer UTF-8-Kodierung schreiben, da er Sonderzeichen enthält. Ich benutze folgenden Code:

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

Es funktioniert, bis die Zelle ein Sonderzeichen enthält. Ich habe es auch mit versucht

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

Es stoppt aber auch, wenn ein Sonderzeichen erscheint. Ich habe keine Ahnung, was ich falsch mache.

69
Martin

Von Ihrem Shell-Lauf aus:

pip2 install unicodecsv

Und (im Gegensatz zur ursprünglichen Frage) gehen Sie davon aus, dass Sie das in csv eingebaute Python-Modul verwenden 
import csv in 
import unicodecsv as csv in Ihrem Code.

90
guaka

Es ist sehr einfach für 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')

Für Python 2.x siehe hier .

52
Zanon

Verwenden Sie dieses Paket, es funktioniert einfach: https://github.com/jdunck/python-unicodecsv

14
Gijs

Die Beispiele in der Python-Dokumentation zeigen, wie Unicode-CSV-Dateien geschrieben werden: http://docs.python.org/2/library/csv.html#examples

(Der Code kann hier nicht kopiert werden, da er urheberrechtlich geschützt ist.)

2
Aaron Digulla

Für mich funktionierte die UnicodeWriter-Klasse aus der Python 2 CSV-Moduldokumentation nicht wirklich, da sie die csv.writer.write_row()-Schnittstelle zerstört.

Zum Beispiel:

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

funktioniert, während:

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

wird AttributeError: 'int' object has no attribute 'encode' werfen.

Da UnicodeWriter offensichtlich erwartet, dass alle Spaltenwerte Zeichenfolgen sind, können wir die Werte selbst konvertieren und einfach das Standard-CSV-Modul verwenden:

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

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

Oder wir können sogar einen csv_writer-Patch hinzufügen, um eine write_utf8_row-Funktion hinzuzufügen - die Übung bleibt dem Leser überlassen.

2

Für python2 können Sie diesen Code vor csv_writer.writerows(rows).__ verwenden.
Dieser Code konvertiert NICHT Ganzzahlen in UTF-8-Zeichenfolgen

 def encode_rows_to_utf8 (Zeilen): 
 encoded_rows = [] 
 für Zeile in Zeilen: 
 encoded_row = [] 
 für Wert in Zeile: 
 wenninstance (Wert, Basiszeichenfolge): 
 value = Unicode (value) .encode ("utf-8") 
 encoded_row.append (Wert) 
 encoded_rows.append (encoded_row) 
 return encoded_rows 
0
pymen