- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
open file, выполнить декдорирование байтов из файла в эквивалентные печатные символы
Есть необходимость открыть файл 'b' режиме, для того, чтобы некоторые байты отобразить как символы (это действительно символы в utf-8). Для простоты составлен текстовый с En и Ru символами файл в utf-8
lst = []
s = 'None'
with open('file','rb') as fl:
while s!=b'':
s = fl.read(1)
lst.append(fl.read(1)) #считываю по 1 байту в список
for i in l: print(i.decode('utf-8'),end=' ') #хочу из сохранённых объектов bytes получить эквивалентные символы utf-8
Насколько я понимаю, итерируя в таком режиме объект file, я получаю именно содержимое файла побайтно в список. если это объект байт и я знаю, что это байт символа, я могу применить метод decode.
Но я получаю ошибку:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: unexpected end of data
Почему я не могу получить из байта, в котором символ этот самый символ.
Если я прямо делаю вот так:
a = 'Привет, мир!'
byte_s = a.encode('utf-8') #получил цепочку байтов
print(byte_s)
print(byte_s.decode('utf-8'))
Всё хорошо
Задаю литерально 2 кирилических символа - всё хорошо
f = b'\xd0\x9f'
print(f.decode('utf-8'))
Файл однозначно в utf-8.
linux, ubuntu, python3.10
Ответы (1 шт):
В каждой итерации цикла читаются два байта. Первый выбрасывается, второй вы складываете в список. Из половины байт текст не восстановишь.
Читайте байты по одному, складывайте их в строку байт. Каждую итерацию пытайтесь раскодировать. Когда получилось, печатайте результат, начинайте с начала.
import sys
with open(sys.argv[1], 'rb') as f:
b = b''
while s := f.read(1):
b += s
try:
s = b.decode(encoding='utf-8')
except UnicodeError:
continue
print(b, repr(s))
b = b''
$ cat utf8.txt Hello! Привет! こんにちは! $ python read.py utf8.txt b'H' 'H' b'e' 'e' b'l' 'l' b'l' 'l' b'o' 'o' b'!' '!' b'\n' '\n' b'\xd0\x9f' 'П' b'\xd1\x80' 'р' b'\xd0\xb8' 'и' b'\xd0\xb2' 'в' b'\xd0\xb5' 'е' b'\xd1\x82' 'т' b'!' '!' b'\n' '\n' b'\xe3\x81\x93' 'こ' b'\xe3\x82\x93' 'ん' b'\xe3\x81\xab' 'に' b'\xe3\x81\xa1' 'ち' b'\xe3\x81\xaf' 'は' b'!' '!' b'\n' '\n'