从文件中读取一个字节串:
>>> 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对象吗?
答案 0 :(得分:0)
因为它不是UTF-8
字符串。 UTF-8
字符无法从0xff
开始。您可以使用errors
标志来控制解码过程。阅读doc
是的,bytes.decode
和bytearray.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)