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'を開くときは、ファイルをバイナリ モードで開くために mode 値に追加する必要があります。これにより、移植性が向上します。

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 に答える