Python 3错误:TypeError:无法转换'字节'在具有3个以上元素的字符串中隐式地对象str

时间:2016-01-19 15:41:58

标签: python python-3.x python-3.4

我想制作SHA256 hasher,它将保存文本文件中的输入和输出。我搜索了stackoverflow的答案,但它没有工作。我希望它写在文本文件中:

all = str("At: " + date + " you have encrypted: " + text + " into:" + hex_dig)
text_file.write(together)

虽然日期如下:

date = time.strftime("%Y-%m-%d %H:%M:%S")

我在示例的第一行给出了这个错误:TypeError: Can't convert 'bytes' object to str implicitly

3 个答案:

答案 0 :(得分:2)

我猜测hex_dig是一个字节对象(您是否使用digest而不是hexdigest来获取哈希?)。如果是这种情况,只需使用正确的功能就可以解决这个问题:

sha256_hasher = hashlib.sha256()
sha256_hasher.update(your_data_goes_here)
hex_dig = sha256_hasher.hexdigest()

其他,更常见的是,您尝试将strbytes个对象连接在一起。你不能这样做。您需要将bytes对象转换为字符串。如果它只包含文本数据,您可以解码它:

hex_dig = hex_dig.decode("ascii")

或者,如果它只包含字节,并且您想要查看十六进制,则可以使用binascii.hexlify(您还需要decode,因为它返回一个字节):

import binascii
hex_dig = binascii.hexlify(hex_dig).decode("ascii")

顺便说一下,你不需要在str函数调用中包装一个字符串,如果你想得到一个已经不是的对象的字符串表示,你只需要这样做一个字符串。你拥有的(或你想要的)已经是一个字符串,因此它是一个冗余的电话。你不能尝试连接不同类型的东西,并将所有内容包装在str cal中,希望python能为你排序 - 它不会胜利(并且不应该如此&#39} #39; s模棱两可 - explicit is better than implicit)。

答案 1 :(得分:0)

date = time.strftime("%Y-%m-%d %H:%M:%S")
all = "At: %s you have encrypted: %s into: %s" % (date, text, hex_dig)
text_file.write(all)

答案 2 :(得分:0)

对于像这样的案例,我强烈推荐使用format方法。

您写道:

all = str("At: " + date + " you have encrypted: " + text + " into:" + hex_dig)

format语法中,它看起来像这样:

all = "At: {} you have encrypted: {} into:{}".format(date,text,hex_dig)

关于format的好处是,它可以轻松处理各种数据类型到字符串(通常)的转换。

提示:如果您想指定哪个订单和/或重复占位符,可以将{}设置为{0} {1} {2}等。