Перекодировать поток Unicode как Ascii, игнорируя ошибки
Я пытаюсь взять поток файлов Unicode, который содержит нечетные символы, и обернуть его потоковым считывателем, который преобразует его в Ascii, игнорируя или заменяя все символы, которые не могут быть закодированы.
Мой поток выглядит так:
"EventId","Rate","Attribute1","Attribute2","(。・ω・。)ノ"
...
Моя попытка изменить поток на лету выглядит так:
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() )
Результат наlog
линия это:UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-40: ordinal not in range(128)
хотя я явно создал StreamReader сerrors='ignore'
Я хотел бы, чтобы результирующий поток (при чтении) получился так:
"EventId","Rate","Attribute1","Attribute2","(?????)?"
...
или, в качестве альтернативы,"EventId","Rate","Attribute1","Attribute2","()"
(с помощью'ignore'
вместо'replace'
)
Почему исключение происходит в любом случае?
Я видел множество проблем / решений для декодирования строк, но моя задача - изменить поток во время его чтения (используя.next()
), поскольку файл потенциально слишком велик для одновременной загрузки в память с использованием.read()