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

时间:2018-02-20 01:57:00

标签: python python-3.x python-2.7 decode encode

以下代码在Python 2.7中运行良好

shipment_price

当我在Python 3.6中运行它时,它给了我各种错误。你知道Python 3.6中上面代码的等价物吗? with open(file_path) as ff: content = ff.read() image_bytes_b64=base64.b64encode(content) function(image_bytes_b64) 是PNG图片的路径。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

open (file_path, 'rb')

尝试用rb打开,附加到模式的'b'以二进制模式打开文件,因此还有'rb','wb'和'r + b'等模式。 Windows上的Python区分了文本和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍微改变。这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据。在读取和写入此类文件时要非常小心地使用二进制模式。在Unix上,将'b'附加到该模式并没有什么坏处,因此您可以将它独立于平台用于所有二进制文件。

- 编辑 -

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

感谢您指出。

为了支持本机Python 2字符串,旧的Django版本必须接受字节串​​和unicode字符串。现在已经删除了Python 2支持,只应在输入/输出边界周围遇到字节串(例如,处理二进制字段或HTTP流)。

对于bytestrings,这会创建一个带有不需要的b前缀的字符串以及其他引号(str(b'foo')是“b'foo”“)。要进行调整,请在传递字节串之前调用decode()。