如何在Python 3中将字节转换为字符串

11

我想编写一个函数,它返回一个字符串而不是字节。
函数如下:

def read_image(path):
    with open(path, "rb") as f:
        data = f.read()
    return data
image_data = read_image("/home/user/icon.jpg")

如何将值image_data转换为字符串类型。如果成功转换为字符串,如何将字符串重新转换为字节。


那么,为什么不能对想要返回的任何内容应用 str() 呢? - dmitryro
2
<字节对象>.decode("utf-8") - Primusa
2
@Primusa,<byte object>.decode("utf-8") 抛出异常。UnicodeDecodeError: 'utf-8' 编解码器无法解码字节0xff - user3410960
4
我不认为你可以把一张JPG图片变成字符串。你计划用它做什么? - Patrick Haugh
为了适应Python 2,一些库使用了我的函数,但这些库是用Python 2编写的。@PatrickHaugh - user3410960
为什么这被标记为重复?这两个问题不同,你不能解码图像的字节。 - Asriel
1个回答

14
为了与旧代码兼容,您想以与Python 2相同的方式返回字符串对象,并将字节对象转换为字符串对象。
可能有一种更简单的方法,但我不知道,所以我选择这样做:
return "".join( chr(x) for x in data)

因为迭代字节会得到整数,所以我强制将它们转换回字符并将结果数组连接成字符串。

如果您需要使代码可以在Python 2和Python 3中都能正常工作(尽管可能会更慢),则需要使代码具有可移植性:

return "".join( chr(x) for x in bytearray(data) )

字节数组在Python 2和Python 3中都可以迭代为整数,而bytes类型则不行。

希望这有所帮助。

错误的方法:

return data.decode(encoding="ascii", errors="ignore")

可能有办法注册自定义错误处理程序,但默认情况下,您将无法获取ASCII范围之外的任何字节。同样,使用UTF-8编码将破坏您的二进制内容。

错误的方法2

str(b'one') == "b'one'" #for py3, but "one" for py2

考虑使用base64编码而不是字符映射。 - Agost Biro
3
或者:return "".join(map(chr,data)) - RufusVS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接