UnicodeDecodeError сообщает вам позицию символа, вызывающего ошибку.Как я могу отобразить этот символ? - PullRequest
0 голосов
/ 17 марта 2019

При открытии / чтении файла с использованием чего-то вроде

with open(<csv_file>) as f:
    df = pandas.read_csv(f)

возможно получить ошибку, такую ​​как

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 1678

Я знаю, что могу использовать расширение vscode, чтобы найтисимвол в csv_file в позиции 1678. Но есть ли способ, которым я могу сделать это с помощью Python.Наивно, как то так.

>>getCharInPosition(1678)
"The character is that position is 'x'"

Или даже лучше, получая номер строки

>>getLineNumOfCharInPosition(1678)
"The line number for the character in that position is 25"

Я ищу способ сделать стандартное сообщение UnicodeDecodeError более полезным, чем просто указание мне позиции символа.

1 Ответ

0 голосов
/ 17 марта 2019

UnicodeError содержит довольно мало информации в своих атрибутах.

Получив исключение, вы можете использовать это, чтобы найти ошибочные байты:

try:
    df = pandas.read_csv(f)
except UnicodeError as e:
    offending = e.object[e.start:e.end]
    print("This file isn't encoded with", e.encoding)
    print("Illegal bytes:", repr(offending))
    raise

Чтобы определить номер строки, вы можете сделать что-то вроде этого (внутри предложения кроме):

    seen_text = e.object[:e.start]
    line_no = seent_text.count(b'\n') + 1

... но я не уверен, является ли e.object всегда (байтовой) строкой (это может вызвать дополнительные проблемы для больших файлов), поэтому я не знаю, всегда ли она работает.

Кроме того, в файле CSV число новых строк может быть больше, чем число логических строк, если в некоторых ячейках есть новые строки.

...