2012-05-22 35 views
19

Parece que debería ser una solución fácil, pero hasta ahora una solución me ha eludido. Tengo un archivo CSV de columna única con caracteres no ASCII guardados en UTF-8 que deseo leer y almacenar en una lista. Estoy intentando seguir el principio de la "Unicode Sandwich" y decodificación al leer el archivo en:Problemas con la entrada UTF-8 CSV en 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) 

Esto produce el temor 'codec no puede codificar los caracteres en la posición, no ordinales de rango (128)' error.

También he intentado adaptar una solución de this answer, que devuelve un error similar

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) 

Una solución muy similar adaptado de los docs devuelve el mismo error.

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) 

Claramente me falta algo. La mayoría de las preguntas que he visto sobre este problema parecen preceder a Python 2.7, por lo que una actualización aquí podría ser útil.

+1

El mensaje de error indica que podría estar tratando de decodificar los datos como ASCII ... –

+1

El segundo ejemplo que funciona para mí, el módulo csv tal vez usted ha roto, me sugieren ¿actualizas tu pitón? O tal vez el error esté en otra parte –

+0

Parece que su archivo CSV original no está codificado como UTF-8. ¿Puede confirmarlo? Tal vez sea UTF-16LE o algo así, o alguna otra codificación específica del idioma. Puede usar el módulo chardet para detectar la codificación. – Ansari

Respuesta

14

Su primer fragmento no funcionará. Está suministrando datos Unicode al lector csv, que (como se documenta) no puede manejarlo.

Tus segundos y terceros fragmentos están confundidos. Algo así como lo siguiente es todo lo que necesita:

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

Esto funciona. No estoy seguro de exactamente qué en el guión original estaba causando el problema, pero tal es la vida. Gracias. – acpigeon

+0

Este módulo también puede ser de ayuda: https://pypi.python.org/pypi/unicodecsv/0.14.1 – Leonid

-3

yo sugeriría tratando simplemente:

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

o

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

csv debe ser consciente de Unicode, y que sólo se debería trabajar.

+0

Específicamente NO es compatible con Unicode, pero tampoco su ejemplo utiliza Unicode. –

+0

no hay tal cosa como "utf-8 aware" –

10

En caso de que falle la lectura del primer carácter, es posible que tenga una lista de materiales. Use codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig') si su archivo es UTF8 y tiene una lista de materiales al principio.

+1

Desafortunadamente el mismo error – acpigeon

Cuestiones relacionadas