Python не может декодировать байтовую строку

#python #encoding #decode

#python #кодирование #декодировать

Вопрос:

У меня возникли проблемы с декодированием байтовой строки, которую я должен отправить с одного компьютера на другой. Файл имеет формат PDF. Я получаю сообщение об ошибке, которое:

 fileStrings[i] = fileStrings[i].decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 648: invalid continuation byte
 

Есть идеи, как удалить маркировку b »? Мне нужно скомпилировать резервную копию файла, но мне также нужно знать его размер в байтах перед отправкой, и я решил, что узнаю это, расшифровав каждую байтовую строку (работает для файлов txt, но не для файлов pdf ..)

Код:

     with open(inputne, "rb") as file:
        while 1:
            readBytes= file.read(dataMaxSize)
            fileStrings.append(readBytes)
            if not readBytes:
                break
            readBytes= ''
    
    filesize=0
    for i in range(0, len(fileStrings)):
        fileStrings[i] = fileStrings[i].decode()
        filesize  = len(fileStrings[i])
 

Редактировать: для тех, у кого такая же проблема, параметр len() даст вам размер без b «.

Комментарии:

1. «размер в байтах» — при декодировании байты преобразуются в символы, а количество символов не совпадает с количеством байтов. это один символ, но 3 байта: b'xe2x88x9e' , или 8 байт в UTF32.

Ответ №1:

В Python байтовые строки предназначены для необработанных двоичных данных, а строки — для текстовых данных. decode пытается декодировать ее как utf-8, который действителен для файлов txt, но не для файлов pdf, поскольку они могут содержать случайные байты. Вы не должны пытаться получить строку, поскольку байтовые строки предназначены для этой цели. Вы можете получить длину байтовых строк, как обычно, с len(data) помощью . Многие из строковых операций также применяются к байтовым строкам, таким как конкатенация и нарезка ( data1 data2 и data[1:3] ).

В качестве примечания, b'' когда вы печатаете это только потому __str__ , что метод для bytestrings эквивалентен repr . Это не в самих данных.

Комментарии:

1. Разве он не учитывает b ‘ ‘ в размере, когда я использую len()? РЕДАКТИРОВАТЬ: Нет, это не учитывает b ‘ ‘ в len, как примечание для кого-то, у кого такая же проблема, как у меня. Спасибо за ваш ответ @Aplet123, это помогло.