2013-06-01 265 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)