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

Joe*_*e50 6 python string base64 python-3.x data-uri

我想知道是否有可能将我从读取文件获得的字节字符串转换为字符串(所以type(output) == str).到目前为止,我在Google上找到的所有内容都有答案,例如你如何编码PNG图像以便在CSS文件中使用数据uri?看起来好像它可以在python 2中工作(如果我没有弄错的话,字符串仍然是字节字符串),但它不再适用于python 3.4.

我想将这个结果字节字符串转换为普通字符串的原因是我想使用这个base64编码的数据存储在JSON对象中,但我一直收到类似于的错误:

TypeError: b'Zm9v' is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

以下是出错的最小示例:

import base64
import json
data = b'foo'
myObj = [base64.b64encode(data)]
json_str = json.dumps(myObj)
Run Code Online (Sandbox Code Playgroud)

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

小智 15

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

myObj = [base64.b64encode(data).decode('ascii')]
Run Code Online (Sandbox Code Playgroud)

/sf/answers/2994369801/对此进行了解释:

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'
Run Code Online (Sandbox Code Playgroud)


Vic*_*tor 8

尝试

data = b'foo'.decode('UTF-8')
Run Code Online (Sandbox Code Playgroud)

代替

data = b'foo'
Run Code Online (Sandbox Code Playgroud)

将其转换为字符串.


小智 5

尝试这个:

def bytes_to_base64_string(value: bytes) -> str:
   import base64
   return base64.b64encode(value).decode('ASCII')
Run Code Online (Sandbox Code Playgroud)

人们经常会犯一种误解,尤其是来自 Java 世界的人。实际上将字节bytes.decode('ASCII')编码为字符串,而不是解码它们。