El codec ‘ascii’ de Python csv unicode no puede codificar el carácter u ‘\ xf6’ en la posición 1: ordinal no está dentro del rango (128)

He copiado este script de [sitio web de python] [1] Esta es otra pregunta, pero ahora hay un problema con la encoding:

import sqlite3 import csv import codecs import cStringIO import sys class UTF8Recoder: """ Iterator that reads an encoded stream and reencodes the input to UTF-8 """ def __init__(self, f, encoding): self.reader = codecs.getreader(encoding)(f) def __iter__(self): return self def next(self): return self.reader.next().encode("utf-8") class UnicodeReader: """ A CSV reader which will iterate over lines in the CSV file "f", which is encoded in the given encoding. """ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): f = UTF8Recoder(f, encoding) self.reader = csv.reader(f, dialect=dialect, **kwds) def next(self): row = self.reader.next() return [unicode(s, "utf-8") for s in row] def __iter__(self): return self class UnicodeWriter: """ A CSV writer which will write rows to CSV file "f", which is encoded in the given encoding. """ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): # Redirect output to a queue self.queue = cStringIO.StringIO() self.writer = csv.writer(self.queue, dialect=dialect, **kwds) self.stream = f self.encoder = codecs.getincrementalencoder(encoding)() def writerow(self, row): self.writer.writerow([s.encode("utf-8") for s in row]) # Fetch UTF-8 output from the queue ... data = self.queue.getvalue() data = data.decode("utf-8") # ... and reencode it into the target encoding data = self.encoder.encode(data) # write to the target stream self.stream.write(data) # empty queue self.queue.truncate(0) def writerows(self, rows): for row in rows: self.writerow(row) 

Este problema de tiempo con la encoding, cuando ejecuté esto me dio este error:

 Traceback (most recent call last): File "makeCSV.py", line 87, in  uW.writerow(d) File "makeCSV.py", line 54, in writerow self.writer.writerow([s.encode("utf-8") for s in row]) AttributeError: 'int' object has no attribute 'encode' 

Luego convertí todos los enteros en una cadena, pero esta vez recibí este error:

 Traceback (most recent call last): File "makeCSV.py", line 87, in  uW.writerow(d) File "makeCSV.py", line 54, in writerow self.writer.writerow([str(s).encode("utf-8") for s in row]) UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128) 

He implementado anteriormente para tratar con caracteres Unicode, pero me da tal error. ¿Cuál es el problema y cómo solucionarlo?

Entonces convertí todos los enteros a la cadena,

Convirtió enteros y cadenas en cadenas de bytes . Para las cadenas, se usará la encoding de caracteres predeterminada que resulta ser ASCII, y esto falla cuando tiene caracteres que no son ASCII. Quieres unicode lugar de str .

 self.writer.writerow([unicode(s).encode("utf-8") for s in row]) 

Podría ser mejor convertir todo a Unicode antes de llamar a ese método. La clase está diseñada específicamente para analizar cadenas Unicode. No fue diseñado para soportar otros tipos de datos.

De la documentación:

A diferencia del módulo StringIO, este módulo no puede aceptar cadenas Unicode que no pueden codificarse como cadenas ASCII simples.

Es decir, solo se pueden almacenar cadenas limpias de 7 bits.

Si está utilizando Python 2:

hacer la encoding como: str (s.encode (“utf-8”)) es decir

 def writerow(self, row): self.writer.writerow([str(s.encode("utf-8")) for s in row]) # Fetch UTF-8 output from the queue ... data = self.queue.getvalue() data = data.decode("utf-8") # ... and reencode it into the target encoding data = self.encoder.encode(data) # write to the target stream self.stream.write(data) # empty queue self.queue.truncate(0)