【问题标题】:how to convert bytes to string in Python 3 [duplicate]如何在 Python 3 中将字节转换为字符串 [重复]
【发布时间】:2018-06-11 08:08:31
【问题描述】:

我想编写一个返回字符串而不是字节的函数。
功能:

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。 如果转换为字符串成功,如何将字符串重新转换为字节。

【问题讨论】:

  • 那么你为什么不能把str() 应用到你想要返回的任何东西上呢?
  • .decode("utf-8")
  • @Primusa,.decode("utf-8") 抛出异常。UnicodeDecodeError:'utf-8' codec can't decode byte 0xff
  • 我不认为您可以从 jpg 图像中创建字符串。你打算用它做什么?
  • 为了适配 Python 2。一些库使用我的函数,但库是用 Python 2 编写的。@PatrickHaugh

标签: python python-3.x


【解决方案1】:

为了与旧代码兼容,您希望返回一个字符串对象,就像它在 python2 中的方式一样,并将字节对象转换为字符串对象。

可能有更简单的方法,但我不知道,所以我会选择这样做:

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

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

如果您需要使代码可移植,以便您的新方法在 Python2 和 Python 3 中仍然有效(尽管可能会更慢):

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

Bytearray 在 py2 和 py3 中迭代为整数,这与字节不同。

希望有帮助。

错误的做法:

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

可能有注册自定义错误处理程序的方法,但默认情况下,您将丢失任何超出 ascii 范围的字节。同样,使用 UTF-8 编码会弄乱您的二进制内容。

错误的做法2

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

【讨论】:

  • 考虑 base64 编码而不是映射字符
  • 或:return "".join(map(chr,data))
猜你喜欢
  • 2019-01-25
  • 2018-08-31
  • 2021-05-11
  • 2015-09-12
  • 1970-01-01
  • 2021-11-17
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多