ファイルをバイナリ モードで開く必要があります。
f = open('kitten.jpeg', 'wb')
それ以外の場合、Python は行末をネイティブ プラットフォーム フォームに変換します。これは、バイナリ データを分割する変換であり、open()
関数について文書化されています。
デフォルトでは、テキスト モードを使用します。これは'\n'
、書き込み時に文字をプラットフォーム固有の表現に変換し、読み取り時に戻す場合があります。したがって、バイナリ ファイル'b'
を開くときは、ファイルをバイナリ モードで開くために mode 値に追加する必要があります。これにより、移植性が向上します。
URL からファイルにデータをコピーする場合、shutil.copyfileob()
ストリーミングを効率的に処理するために使用できます。
from shutil import copyfileobj
im = urllib2.urlopen(url)
with open('kitten.jpeg', 'wb') as out:
copyfileobj(im, out)
これにより、データがチャンクで読み取られ、バイナリ データの大きなブロブでメモリがいっぱいになるのを回避できます。このwith
ステートメントは、ファイル オブジェクトを閉じる処理を行います。