Python: ‘charmap’ codec can’t decode byte 0x98

526 просмотра
0
0 Комментариев

Добрый день
Считываю utf8-файл и вывожу в консоль. При попытке вывести букву «И» возникает ошибка:

File "I:\ProgramFile\Anaconda\lib\encodings\cp1251.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1: character maps to < undefined >

Воспроизводится на вот таком примере:

test_text_1 = "Задача\n"
test_text_2 = "Итератор"
 
file = open('temp.txt', 'w', encoding='utf-8')
file.write(test_text_1)
file.write(test_text_2)
file.close()
 
text = open('temp.txt', 'rb')
 
for byte_code in text:
    print(byte_code.strip())
    test_text = byte_code.decode('cp1251')
    print(test_text.strip())

Первое слово выводится нормально, а на втором — ошибка. Никак не могу найти способ побороть проблему.

UPD: Видимо я описал проблему слишком широко, исправляюсь:

Как конвертировать «И» из utf-8 в cp1251? Для «А» всё работает, а для «И» — нет.

Код:

byte1 = 'А'.encode('utf-8')
byte2 = 'И'.encode('utf-8')
print(byte1, byte2)
test1 = byte1.decode('cp1251')
print(test1)
test2 = byte2.decode('cp1251')
print(test2)


Добавить комментарий

2 Answers

Python Опубликовано 18.12.2018
0

Если у вас файл записан в кодировке utf-8, то и декодировать нужно из кодировки utf-8:

...
for byte in text:
    print(byte.strip())
    text = byte.decode('utf-8')
    print(text.strip())

Результат:

b'\xd0\x97\xd0\xb0\xd0\xb4\xd0\xb0\xd1\x87\xd0\xb0'
Задача
b'\xd0\x98\xd1\x82\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xbe\xd1\x80'
Итератор

Когда вы записываете текст в файл в какой-то кодировке, вы фактически превращаете внутреннее представление текста в байты в указанной кодировке. Чтобы правильно декодировать эти байты обратно во внутреннее представление, при декодировании нужно указать ту же кодировку, что и при записи.

Добавить комментарий
0

Чтобы напечатать файл, содержащий текст в utf-8 кодировке, в консоль (аналог type filename в cmd.exe) в Питоне:

#!/usr/bin/env python3
import shutil
import sys
 
with open(filename, encoding='utf-8') as file:
    shutil.copyfileobj(file, sys.stdout)

Если хочется напечатать Юникодные символы, которые непредставимы в chcp кодировке (OEM code page), то см. Как из Python вывести на Windows-консоль строку в Юникоде?

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up