2

我正在使用网站http://placekitten.com制作程序,但我遇到了一些问题。使用这个:

im = urllib2.urlopen(url).read()
f = open('kitten.jpeg', 'w')
f.write(im)
f.close()

图像因颜色不匹配而失真,如下所示:

http://imgur.com/zVg64Kn.jpeg

我想知道是否有替代使用 urllib2 提取图像的方法。如果有人可以提供帮助,那就太好了!

4

3 回答 3

4

您需要以二进制模式打开文件:

f = open('kitten.jpeg', 'wb')

否则,Python 会将行尾转换为本机平台形式,这是一种破坏二进制数据的转换,如open()函数所述:

默认是使用文本模式,它可以'\n'在写入和读取时将字符转换为特定于平台的表示。因此,在打开二进制文件时,应附加'b'到模式值以二进制模式打开文件,这将提高可移植性。

将数据从 URL 复制到文件时,您可以使用它shutil.copyfileob()来有效地处理流式传输:

from shutil import copyfileobj

im = urllib2.urlopen(url)
with open('kitten.jpeg', 'wb') as out:
    copyfileobj(im, out)

这将以块的形式读取数据,避免用大量二进制数据填充内存。该with语句为您处理关闭文件对象。

于 2013-06-01T22:32:03.930 回答
1

改变

f = open('kitten.jpeg', 'w')

读书

f = open('kitten.jpeg', 'wb')

有关详细信息,请参阅http://docs.python.org/2/library/functions.html#open。发生的事情是 jpeg 中的换行符在保存过程中被修改,并且作为二进制文件打开会阻止这种情况。

于 2013-06-01T22:32:53.060 回答
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)
于 2013-06-01T22:33:21.963 回答