2016-04-11 8 views
-1

Ich habe UTF-8 (kein BOM) CSV-Datei kodiert:Ausgabe CSV-Datei-Codierung ist falsch UTF-8

aaa;bbb;ccc 
fff;äää;ööö 

folgenden Ausschnitt liest die Datei und speichert ihn dann wieder unterschiedliche Codierung:

import csv 

rows = [] 
with open('test_in.csv', 'r', newline='') as file: 
    csvReader = csv.reader(file, delimiter=';') 
    for row in csvReader: 
     rows.append(row) 

with open('test_out.csv', 'w', newline='', encoding='iso-8859-1') as file: 
    csvWriter = csv.writer(file, delimiter=';', quoting=csv.QUOTE_MINIMAL) 
    for row in rows: 
     csvWriter.writerow(row) 

Problem: Gespeicherte Datei ist nicht ISO-8859-1, aber utf-8 codiert.

Wenn ich die Datei las mit folgenden Liste in meiner UTF-8 kodierten Quellcodedatei ersetzen, funktioniert es richtig:

rows = [ 
    ['aaa','bbb','ccc'], 
    ['fff','äää','ööö'] 
] 

Ist das ein Fehler in Python? Oder muss ich zusätzliche Kodierungsoptionen verwenden?

Getestet mit Python 3.4.

Antwort

0

Es encoding für open() Option scheint nicht funktioniert, wie ich dachte (ich es standardmäßig auf UTF-8 angenommen). Docs für open sagen:

Codierung der Name der Codierung verwendet ist, um die Datei zu entschlüsseln oder zu codieren. Dies sollte nur im Textmodus verwendet werden. Die Standardcodierung ist plattformabhängig (was auch immer locale.getpreferredencoding() zurückgibt), aber jede von Python unterstützte Textcodierung kann verwendet werden. ...

Und auf meinem System scheint es-cp1252 auf Standard. So repr(rows) kehrt

[['aaa', 'bbb', 'ccc'], ['fff', 'äää', 'ööö']] 

Fix ist explizit Codierung angeben, kann auch für die Eingabedatei:

with open('test_in.csv', 'r', newline='', encoding='utf-8') as file: 
1

habe ich versucht, mit python3.5.1 und es funktionierte gut für mich:

[email protected]:~$ rm test_out.csv 
[email protected]:~$ ls test_in.csv 
test_in.csv 
[email protected]:~$ cat my.py 
import csv 

rows = [] 
#with open('my.csv', 'r', newline='', encoding='utf-8') as file: 
with open('test_in.csv', 'r', newline='') as file: 
    csvReader = csv.reader(file, delimiter=';') 
    for row in csvReader: 
     rows.append(row) 

with open('test_out.csv', 'w', newline='', encoding='iso-8859-1') as file: 
    csvWriter = csv.writer(file, delimiter=';', quoting=csv.QUOTE_MINIMAL) 
    for row in rows: 
     csvWriter.writerow(row) 
[email protected]:~$ 
[email protected]:~$ python3.5 my.py 
[email protected]:~$ ls test_out.csv 
test_out.csv 
[email protected]:~$ file test_*.csv 
test_in.csv: UTF-8 Unicode text 
test_out.csv: ISO-8859 text, with CRLF line terminators 
[email protected]:~$