2012-05-22 6 views
19

Dies scheint wie es eine einfache Lösung sein sollte, aber bis jetzt eine Lösung ist mir entgangen. Ich habe eine einzelne Spalte CSV-Datei mit Nicht-ASCII-Zeichen in utf-8 gespeichert, die ich einlesen und in einer Liste speichern möchte. Ich bin versucht, das Prinzip der "Unicode Sandwich" und Decodierung beim Lesen der Datei in folgen:Problem mit UTF-8 CSV-Eingabe in Python

import codecs 
import csv 

with codecs.open('utf8file.csv', 'rU', encoding='utf-8') as file: 
input_file = csv.reader(file, delimiter=",", quotechar='|') 
list = [] 
for row in input_file: 
    list.extend(row) 

Dies erzeugt die Angst ‚Codec kodieren, kann nicht in Position Zeichen, Ordnungszahl nicht in Reichweite (128)‘ Fehler.

Ich habe auch versucht, eine Lösung aus this answer Anpassung, die eine ähnliche Fehler

def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs): 
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs) 
    for row in csv_reader: 
     yield [unicode(cell, 'utf-8') for cell in row] 

filename = 'inputs\encode.csv' 
reader = unicode_csv_reader(open(filename)) 
target_list = [] 
for field1 in reader: 
    target_list.extend(field1) 

Eine sehr ähnliche Lösung aus den docs kehrt der gleiche Fehler angepasst zurückgibt.

def unicode_csv_reader(utf8_data, dialect=csv.excel): 
    csv_reader = csv.reader(utf_8_encoder(utf8_data), dialect) 
    for row in csv_reader: 
     yield [unicode(cell, 'utf-8') for cell in row] 

def utf_8_encoder(unicode_csv_data): 
    for line in unicode_csv_data: 
    yield line.encode('utf-8') 

filename = 'inputs\encode.csv' 
reader = unicode_csv_reader(open(filename)) 
target_list = [] 
for field1 in reader: 
    target_list.extend(field1) 

Offensichtlich vermisse ich etwas. Die meisten der Fragen, die ich bezüglich dieses Problems gesehen habe, scheinen Python 2.7 vorauszugehen, daher könnte ein Update hier nützlich sein.

+1

Die Fehlermeldung deutet darauf hin, es könnte die Daten als ASCII zu entschlüsseln versuchen ... –

+1

Ihr zweites Beispiel funktioniert für mich, vielleicht haben Sie gebrochen csv-Modul, schlage ich vor, Sie aktualisieren Ihr Python? Oder vielleicht ist der Fehler an anderer Stelle –

+0

Es klingt wie Ihre ursprüngliche CSV-Datei nicht als UTF-8 kodiert ist - können Sie bestätigen, dass es ist? Vielleicht ist es UTF-16LE oder etwas oder eine andere sprachspezifische Codierung. Sie können das chardet-Modul verwenden, um die Codierung zu erkennen. – Ansari

Antwort

14

Ihr erstes Snippet wird nicht funktionieren. Sie füttern Unicode-Daten an den CSV-Reader, der (wie dokumentiert) nicht damit umgehen kann.

Ihre zweiten und dritten Snippets sind verwirrt. So etwas wie die folgende ist alles, was Sie brauchen:

f = open('your_utf8_encoded_file.csv', 'rb') 
reader = csv.reader(f) 
for utf8_row in reader: 
    unicode_row = [x.decode('utf8') for x in utf8_row] 
    print unicode_row 
+0

Das funktioniert. Ich weiß nicht genau, was in meinem ursprünglichen Skript das Problem verursacht hat, aber so ist das Leben. Vielen Dank. – acpigeon

+0

Dieses Modul kann auch hilfreich sein: https://pypi.python.org/pypi/unicodecsv/0.14.1 – Leonid

-3

würde ich versuchen, nur vorschlagen:

input_file = csv.reader(open('utf8file.csv', 'r'), delimiter=",", quotechar='|') 

oder

input_file = csv.reader(open('utf8file.csv', 'rb'), delimiter=",", quotechar='|') 

csv bewusst Unicode sein sollte, und es sollte einfach funktionieren.

+0

es ist speziell nicht Unicode bewusst, aber auch nicht Ihr Beispiel verwenden Unicode. –

+0

gibt es keine "utf-8 aware" –

10

Wenn das erste Zeichen nicht gelesen wird, ist möglicherweise eine Stückliste vorhanden. Verwenden Sie codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig'), wenn Ihre Datei UTF8 ist und am Anfang eine Stückliste hat.

+1

Gleicher Fehler leider – acpigeon