bytestr.decode('utf8')返回UnicodeDecodeError

时间:2015-11-04 17:49:10

标签: python-3.x

从文件中读取一个字节串:

>>> s = b'------WebKitFormBoundary02jEyE1fNXSRCL7D\r\nContent-Disposition: form-data; name="fileobj"; filename="3d15ef5126d4fa6631a863c29c5a741d.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xe1\x006Exif\x00\x00II*'
>>> s
b'------WebKitFormBoundary02jEyE1fNXSRCL7D\r\nContent-Disposition: form-data; name="fileobj"; filename="3d15ef5126d4fa6631a863c29c5a741d.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xe1\x006Exif\x00\x00II*'
>>> print(s.decode('utf8'))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 167: invalid start byte

为什么UnicodeDecodeError? s.decode('utf8')必须返回str对象吗?

2 个答案:

答案 0 :(得分:0)

因为它不是UTF-8字符串。 UTF-8字符无法从0xff开始。您可以使用errors标志来控制解码过程。阅读doc

是的,bytes.decodebytearray.decode返回str个对象。

答案 1 :(得分:0)

bytestring包含二进制图像等。 'utf-8'是一种字符编码 - 用于编码文本,而不是图像等二进制数据。

通常,要解析MIME数据,可以使用email stdlib包。

在你的情况下,找到标题的结尾(空行)就足够了,并将其余部分保存为图像:

import cgi

headers, _, image = s.partition(b'\r\n\r\n')
L = [cgi.parse_header(h)[1].get('filename') # parse headers, to get filename
     for h in headers.decode('ascii', 'strict').splitlines()] 
filename = next(filter(None, L))
with open(filename, 'wb') as file:
    file.write(image)