Vuelva a codificar la secuencia Unicode como Ascii ignorando errores
Estoy tratando de tomar una secuencia de archivo Unicode, que contiene caracteres extraños, y envolverla con un lector de secuencia que la convertirá a Ascii, ignorando o reemplazando todos los caracteres que no se pueden codificar.
Mi transmisión se ve así:
"EventId","Rate","Attribute1","Attribute2","(。・ω・。)ノ"
...
Mi intento de alterar la transmisión sobre la marcha se ve así:
import chardet, io, codecs
with open(self.csv_path, 'rb') as rawdata:
detected = chardet.detect(rawdata.read(1000))
detectedEncoding = detected['encoding']
with io.open(self.csv_path, 'r', encoding=detectedEncoding) as csv_file:
csv_ascii_stream = codecs.getreader('ascii')(csv_file, errors='ignore')
log( csv_ascii_stream.read() )
El resultado en ellog
la línea es:UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-40: ordinal not in range(128)
a pesar de que explícitamente construí el StreamReader conerrors='ignore'
Me gustaría que la secuencia resultante (cuando se lea) salga así:
"EventId","Rate","Attribute1","Attribute2","(?????)?"
...
o alternativamente,"EventId","Rate","Attribute1","Attribute2","()"
(utilizando'ignore'
en lugar de'replace'
)
¿Por qué ocurre la excepción de todos modos?
He visto muchos problemas / soluciones para decodificar cadenas, pero mi desafío es cambiar la transmisión a medida que se lee (usando.next()
), porque el archivo es potencialmente demasiado grande para cargarlo en la memoria de una vez usando.read()