Файл чтения Python и определение источника UnicodeDecodeError - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь прочитать текстовый файл, используя следующую инструкцию:

with open(inputFile) as fp:  
    for line in fp:
        if len(line) > 0:
            lineRecords.append(line.strip());

Проблема в том, что я получаю следующую ошибку:

return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 6880: character maps to <undefined>

Мой вопрос, как я могуточно определить, где в файле встречается ошибка, поскольку позиция, которую дает Python, связана с положением в записи, читаемой в данный момент, а не с позицией абсолютного освобождения в файле.Так это 6,880 символов в записи 20 или 6,880 символов в записи 2000 года?Без информации о записи значение позиции, возвращаемое Python, бесполезно.

Итог: есть ли способ заставить Python сообщить мне, какую запись он обрабатывал в момент обнаружения ошибки?

(И да, я знаю, что 0x9d - это символ табуляции, и я могу выполнить его поиск, но это не то, что мне нужно.)

Спасибо.

Обновление: сообщение на UnicodeEncodeError: кодек 'charmap' не может кодировать - символ отображается на , функция печати не имеет ничего общего с вопросом, который я задаю - как я могу получить Python дляскажите, какую запись входного файла он читал, когда обнаружил ошибку Unicode.

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Я думаю, что единственный способ - это отдельно отслеживать номер строки и выводить ее самостоятельно.

with open(inputFile) as fp:
    num = 0
    try:
        for num, line in enumerate(fp):
            if len(line) > 0:
                lineRecords.append(line.strip())
    except UnicodeDecodeError as e:
        print('Line ', num, e)
0 голосов
/ 06 марта 2019

Я сталкивался с этой проблемой ранее, и самое простое решение - открыть файл в режиме utf8

with open(inputFile, encoding="utf8") as fp:
0 голосов
/ 06 марта 2019

Вы можете использовать метод read объекта файла, чтобы получить первые 6880 символов, закодировать его, а длина полученного байтового объекта будет индексом начального байта символа-нарушителя:

with open(inputFile) as fp:
    print(len(fp.read(6880).encode()))
...