2013-06-01 166 views

回答

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语句为您处理关闭文件对象。

+0

太感谢你了! –

1

变化

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

阅读

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

更多信息请参见http://docs.python.org/2/library/functions.html#open。发生什么情况是jpeg中的换行符在保存过程中得到了修改,而打开为二进制文件将阻止这种情况发生。

0

如果你使用的是Windows,你必须以二进制方式打开文件:

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

或者更Pythonically:

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)