python 2.7 vs 3 编码解码字节字符串

python 2.7 vs 3 encode decode bytes string

下面的代码 运行 在 Python 2.7

中很好用
with open(file_path) as ff:
    content = ff.read()
image_bytes_b64=base64.b64encode(content)
function(image_bytes_b64)

当我在 Python 3.6 中 运行 它时,它给了我各种各样的错误。你知道上面的代码在 Python 3.6 中的等价物是什么吗? file_path 是 PNG 图片的路径。

以二进制模式打开文件,然后它应该可以工作:

with open(file_path, 'rb') as ff:
    content = ff.read()
image_bytes_b64=base64.b64encode(content)
function(image_bytes_b64)

open (file_path, 'rb')

尝试用 rb 打开,'b' 附加到模式以二进制模式打开文件,因此还有 'rb'、'wb' 和 'r+b' 等模式. Python on Windows 区分文本文件和二进制文件;读取或写入数据时,文本文件中的 end-of-line 字符会自动略微更改。这种 behind-the-scenes 对文件数据的修改对于 ASCII 文本文件没有问题,但它会损坏二进制数据,例如 JPEG 或 EXE 文件中的二进制数据。读取和写入此类文件时,请务必小心使用二进制模式。在 Unix 上,将 'b' 附加到模式并没有坏处,因此您可以对所有二进制文件使用 platform-independently。

--编辑--

需要再进行一次更改 image_bytes_b64=base64.b64encode(content).decode()

感谢您指出。

为了支持原生 Python 2 字符串,旧的 Django 版本必须接受字节串​​和 unicode 字符串。现在 Python 2 支持被删除,bytestrings 应该只在 input/output 边界附近遇到(例如二进制字段或 HTTP 流的处理)。

对于字节串,这会创建一个带有不需要的 b 前缀和附加引号的字符串(str(b'foo') 是 "b'foo'")。为了适应,在传递字节串之前调用 decode()。