我正在尝试使用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)
答案 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)