Вы смешиваете стороны кодирования и декодирования.
Для декодирования у вас все в порядке. Вы открываете его как двоичные данные, chardet
первый 1K, затем снова открываете в текстовом режиме с использованием обнаруженной кодировки.
Но затем вы пытаетесь продолжить декодирование уже декодированных данных как ASCII, используя codecs.getreader
. Эта функция возвращает StreamReader
, который декодирует данные из потока. Это не сработает. Вам необходимо закодировать эти данные в ASCII.
Но непонятно, почему вы используете декодер потока codecs
или в первом место, когда все, что вы хотите сделать, это кодировать один кусок текста за один раз, чтобы вы могли его зарегистрировать. Почему бы просто не вызвать метод encode
?
log(csv_file.read().encode('ascii', 'ignore'))
Если вы хотите что-то, что вы можете использовать в качестве ленивого итерации строк, вы могли бы построить что-то полностью общее, но гораздо проще просто сделать что-то вроде примера UTF8Recorder
в документах csv
:
class AsciiRecoder:
def __init__(self, f, encoding):
self.reader = codecs.getreader(encoding)(f)
def __iter__(self):
return self
def next(self):
return self.reader.next().encode("ascii", "ignore")
Или еще проще:
with io.open(self.csv_path, 'r', encoding=detectedEncoding) as csv_file:
csv_ascii_stream = (line.encode('ascii', 'ignore') for line in csv_file)