如何从python中的url请求将unicode文件(jpg)写入另一个文件

时间:2014-01-24 01:43:12

标签: python file-io unicode python-requests

我正在尝试使用python中的.jpg模块从网址下载requests文件。这是我试过的。 没有错误。但是我无法打开输出文件。

>>> import requests
>>> l = requests.get("http://www.mosta2bal.com/vb/imgcache/2/9086screen.jpg")
>>> l
<Response [200]>
>>> l.text
u'\ufffd\ufffd\ufffd\ufffd\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\ufffd\ufffd\x12EExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x07\x01\x12\x00\x03\x......long text
>>> l.encoding
>>> import codecs
>>> f = codecs.open('out.jpg', mode="w", encoding="utf-8")
>>> f.write(l.text)

2 个答案:

答案 0 :(得分:5)

您尝试访问二进制数据,就像它是文本一样。这意味着请求必须猜测它的编码(并且它所做的任何猜测都是错误的,因为它不是文本)并对其进行解码...只是因此您​​可以将其解码为utf-8。如果你真的很幸运,也许Requests会猜测UTF-8,而你的数据恰好是可以作为UTF-8进行往返的数据,所以它最多只能工作一千次。

只询问binary response content的请求,并将其保存为二进制文件。

虽然我们正在使用它,但您实际上并不是close该文件。您只是坐在交互式解释器中,其中有一个尚未file的开放flush对象。因此,完全有可能最后一个缓冲区的数据,甚至所有数据都不会存在。这正是with声明的用途。

所以:

l = requests.get("http://www.mosta2bal.com/vb/imgcache/2/9086screen.jpg")
with open('out.jpg', 'wb') as f:
    f.write(l.content)

答案 1 :(得分:1)

首先,正如@abarnert在评论中提到的,图像文件由二进制数据组成,而不是文本。要获取数据,请使用.content属性:

data = l.content
with open('image.jpg', 'wb') as image: #Open it in binary mode
    image.write(data)