Замена ошибочного байта некоторой строкой текста. Это код, который я использую для чтения CSV.
Код: Выделить всё
with open(file, "r", newline="") as f:
reader = csv.reader(f)
rows = [row[0].split("\t") for row in reader if row]
return rows
При чтении файла CSV возникает следующая ошибка:
Код: Выделить всё
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 1904: character maps to
Я видел в комментарии, что если вы передадите error=ignore, вы проигнорируете все неверные строки. Я посмотрел документацию, и ошибки="replace" заменят неверные данные 0x9d вопросом?. Итак, теперь открыто это: open(file, "r", newline="", error="replace") но я получаю ту же ошибку с другим байтом.
Код: Выделить всё
UnicodeEncodeError: 'charmap' codec can't encode character '\ufffd' in position 0: character maps to
Итак, я продолжил поиск и нашел это. Итак, очевидно, что \ufffd предназначен для UTF-16, поэтому я передал кодировку="UTF-16" для открытия, и теперь это так: open(file, "r", newline="", error="replace",coding="UTF-16") и теперь новая ошибка.
Код: Выделить всё
UnicodeError: UTF-16 stream does not start with BOM
Итак, я думаю, это не кодировка UTF-16. Итак, я понял, что мне нужно получить кодировку файла. Я осмотрелся еще больше и обнаружил, что класс UnicodeDammit из Beautiful Soup позволяет вам выяснить, что такое кодировка. Итак, я установил это и сделал это.
Код: Выделить всё
with open(path, "r") as f:
uni = UnicodeDammit("\n".join(f.readlines()))
print(uni.original_encoding)
Но невозможно сказать, что проблема в 0x9d. Поэтому я обновил его до этого.
Код: Выделить всё
with open(path, "r", errors="replace") as f:
uni = UnicodeDammit("\n".join(f.readlines()))
print(uni.original_encoding)
Что дает мне бесцеремонный вывод None. На данный момент я растерян и не уверен, каковы мои следующие шаги. Но конечная цель состоит в том, чтобы заменить 0x9b чем-то вроде XXXXXXX или ?, например, что делает error="replace", чтобы его можно было легко найти. Если возможно, я бы предпочел первый с длинной строкой X, поскольку это упрощает задачу, поскольку файл csv уже содержит? как часть его данных. Спасибо за любую помощь.
Подробнее здесь:
https://stackoverflow.com/questions/790 ... -with-ctrl