从2 TypeError更新到python3:只能将str(不是“ bytes”)连接到str

时间:2019-04-14 05:09:15

标签: python

当尝试将模块从python 2升级到使用python 3时,我在尝试对文件数据进行哈希处理时遇到类型错误,当我对数据进行编码时,我遇到TypeError“ Unicode对象必须在哈希之前进行编码”引发TypeError“只能将str(而不是“ bytes”)连接到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()

2 个答案:

答案 0 :(得分: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包含哈希摘要。

答案 1 :(得分:0)

.digest()返回一个“字节对象”,而不是字符串。您还需要decode(),例如:

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

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