将字节字符串转换为 base64 编码的字符串(输出不是字节字符串)

新手上路,请多包涵

我想知道是否可以将我从读取文件中获得的字节字符串转换为字符串(所以 type(output) == str )。到目前为止,我在 Google 上找到的所有答案都是 How do you base-64 encode a PNG image for use in a data-uri in a CSS file? ,它看起来确实可以在 python 2 中工作(如果我没记错的话,字符串无论如何都是字节字符串),但它不再在 python 3.4 中工作。

我想将此生成的字节字符串转换为普通字符串的原因是我想使用此 base64 编码的数据存储在 JSON 对象中,但我不断收到类似于以下内容的错误:

 TypeError: b'Zm9v' is not JSON serializable

这是出错的最小示例:

 import base64
import json
data = b'foo'
myObj = [base64.b64encode(data)]
json_str = json.dumps(myObj)

所以我的问题是:有没有办法将这个类型的对象 bytes 转换为一个类型的对象 str 同时仍然保持base64编码(所以在这个例子中,我想要结果是 ["Zm9v"] 。这可能吗?

原文由 Joeytje50 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

对我有用的是将 b64encode 行更改为:

 myObj = [base64.b64encode(data).decode('ascii')]

这在 https://stackoverflow.com/a/42776711 中有解释:

base64 被有意归类为二进制转换….这是 Python 3 中的一个设计决策,强制字节和文本分离并禁止隐式转换。

接受的答案对我不起作用(Python 3.9)并给出错误:

 Traceback (most recent call last):
  File "/tmp/x.py", line 4, in <module>
    myObj = [base64.b64encode(data)]
  File "/usr/lib64/python3.9/base64.py", line 58, in b64encode
    encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'

原文由 jmou 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试

data = b'foo'.decode('UTF-8')

代替

data = b'foo'

将其转换为字符串。

原文由 Victor - Reinstate Monica 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题