我正在使用网站http://placekitten.com创建一个程序,但我遇到了一些问题。使用这个:
im = urllib2.urlopen(url).read()
f = open('kitten.jpeg', 'w')
f.write(im)
f.close()
图像因颜色不匹配而失真,如下所示:
我想知道是否有替代方法用urllib2提取图像。如果有人可以提供帮助,那就太棒了!
答案 0 :(得分:4)
您需要以二进制模式打开文件:
f = open('kitten.jpeg', 'wb')
Python将以其他方式将行结尾转换为原生平台形式,这是一种打破二进制数据的转换,如open()
function所述:
默认设置是使用文本模式,可以在写入时将
'\n'
个字符转换为特定于平台的表示,然后在读取时返回。因此,在打开二进制文件时,您应该将'b'
附加到模式值以在二进制模式下打开文件,这将提高可移植性。
将数据从URL复制到文件时,您可以使用shutil.copyfileob()
来有效地处理流式传输:
from shutil import copyfileobj
im = urllib2.urlopen(url)
with open('kitten.jpeg', 'wb') as out:
copyfileobj(im, out)
这将以块的形式读取数据,避免使用大量二进制数据填充内存。 with
语句处理为您关闭文件对象。
答案 1 :(得分:1)
更改
f = open('kitten.jpeg', 'w')
阅读
f = open('kitten.jpeg', 'wb')
有关详细信息,请参阅http://docs.python.org/2/library/functions.html#open。发生的事情是jpeg中的换行符在保存过程中被修改,而打开作为二进制文件将阻止这种情况。
答案 2 :(得分:0)
如果您使用的是Windows,则必须以二进制模式打开文件:
f = open('kitten.jpeg', 'wb')
或更多Python:
import urllib2
url = 'http://placekitten.com.s3.amazonaws.com/homepage-samples/200/140.jpg'
image = urllib2.urlopen(url).read()
with open('kitten.jpg', 'wb') as handle:
handle.write(image)