Обновление до python3 с 2 TypeError: может объединять только str (не «байты») в str

#python

#python

Вопрос:

При попытке обновить модуль с python 2 до использования python 3 я сталкиваюсь с ошибками типа при попытке хэширования данных файла, я сталкиваюсь с ошибкой типа «Unicode-объекты должны быть закодированы перед хэшированием» когда я кодирую данные, он выдает ошибку типа «может объединять только str (не «байты») в str «

     with open(realPath, "rb") as fn:
        while True:
            filedata = fn.read(self.piece_length)

            if len(filedata) == 0:
                break
            length  = len(filedata)
            ##First error was here fixed with .decode()
            data  = filedata.decode('utf-8')

            if len(data) >= self.piece_length:
                info_pieces  = sha1(data[:self.piece_length]).digest()
                data = data[self.piece_length:]

            if check_md5:
                md5sum.update(filedata)
    if len(data) > 0:
        ##New error happens here
        info_pieces  = sha1(data).digest()
  

Ответ №1:

Хэш-функции работают bytes , но не str сейчас. Таким образом, объект, который вы передаете sha1 , должен быть bytes , и возвращаемое значение .digest() также будет bytes .

Поэтому вы должны кодировать строку data в байты перед передачей sha1() , например:

 info_pieces  = sha1(data[:self.piece_length].encode('utf-8')).digest()
  

Убедитесь, что вы инициализировали свои переменные, такие как data = '' и info_pieces = b'' , поскольку data это декодированный текст и info_pieces содержит дайджесты хэша.

Ответ №2:

.digest() возвращает «байтовый объект», а не строку. Вам также нужно decode() это, например:

info_pieces = sha1(data).digest().decode('utf-8')

или

info_pieces = str(sha1(data).digest(), 'utf-8')

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

1. Я пытался сделать это таким образом, он просто выдает одно и то же «Unicode-объекты должны быть закодированы перед хешированием»

2. о, извините, я отвечал на when I encode the data it then throws a TypeError "can only concatenate str (not "bytes") to str" часть.