Проблема перегнать байты в текст
В общем когда пытаюсь перегнать байты в текст выдается такая ошибка
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 16: invalid start byte
Ошибка происходит на этой строке
rt = codecs.utf_8_decode(bt)
Мне нужно чтобы он игнорировал эту строку или просто убрать b'' из значения в списке.
import codecs
text = open('main3.txt',"r")
line = text.readlines()
lis1=[]
lis2=[]
flag = 0 #1
g=0 #1
lis1.append("")
for x in enumerate(line):
if x[1][:1] == "X":
flag=1
else:
if flag==1:
g+=1
lis1.append("")
flag = 0
if flag==1:
lis1[g]+=x[1][2:].replace("\n",'')
lis1.remove("")
for xml in lis1:
bt = codecs.decode(xml, 'hex')
lis2.append(bt)
rt = codecs.utf_8_decode(bt)
print(rt)
Текст из main3.txt
52464820020000004C02000022020000B80400002020202020 20202000000000B8040000140000003C56657273696F6E3E32 3C2F56657273696F6E3E1C0000003C466F726D61743E202020 20202020203C2F466F726D61743E202020180000003C456E63
Ответы (2 шт):
Нужно знать какая кодировка использовалась, иначе будут проблемы вида codec can't decode byte 0xb8 in position 16: invalid start byte.
Вместо codecs.utf_8_decode использовал bytes.decode для того чтобы передать errors='replace', иначе будет такая же ошибка, а так хотя бы разберется.
Пример:
import codecs
text = """\
52464820020000004C02000022020000B80400002020202020
20202000000000B8040000140000003C56657273696F6E3E32
3C2F56657273696F6E3E1C0000003C466F726D61743E202020
20202020203C2F466F726D61743E202020180000003C456E63
"""
text = text.strip()
new_text = []
for line in text.splitlines():
data = codecs.decode(line, 'hex')
text = data.decode('utf-8', errors='replace')
new_text.append(text)
print(''.join(new_text))
# RFH L " � � <Version>2</Version> <Format> </Format> <Enc
Вы наверно хотели это сделать не так сложно:
import codecs
with open('main3.txt') as text:
for line in text:
print(codecs.decode(line.strip(), "hex")
.decode("iso8859_5"))
Вывод:
RFH L"И И<Version>2 </Version><Format> </Format> <Enc
Так как "iso8859_5" 1-байтовое кодирование, не будет никаких ошибок.
Вместо "iso8859_5" вы можете попробовать другой 1-байтовый кодек или "utf_8" (с почти тем же самым результатом), но в последнем случае добавите параметр "ignore" или "replace" для избежания ошибки — значит, последняя строка программы будет например
.decode("utf-8", "ignore"))