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

时间:2015-10-21 20:53:02

标签: python string python-3.x base64 data-uri

我想知道是否可以将从读取文件获得的字节字符串转换为字符串(所以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"]。这可能吗?

2 个答案:

答案 0 :(得分:7)

尝试

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

而不是

data = b'foo'

将其转换为字符串。

答案 1 :(得分:1)

对我有用的是将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'