4

urllib.urlretrieve(url, file_name)プログラムを次のステートメントに進める前に、 が完了したかどうかを確認するにはどうすればよいですか?

たとえば、次のコード スニペットを見てください。

import traceback
import sys
import Image
from urllib import urlretrieve

try:
        print "Downloading gif....."
        urlretrieve(imgUrl, "tides.gif")
        # Allow time for image to download/save:
        time.sleep(5)
        print "Gif Downloaded."
    except:
        print "Failed to Download new GIF"
        raw_input('Press Enter to exit...')
        sys.exit()

    try:
        print "Converting GIF to JPG...."
        Image.open("tides.gif").convert('RGB').save("tides.jpg")
        print "Image Converted"
    except Exception, e:
        print "Conversion FAIL:", sys.exc_info()[0]
        traceback.print_exc()
        pass

経由の「tides.gif」のダウンロードにurlretrieve(imgUrl, "tides.gif")時間がかかりtime.sleep(seconds)、ファイルが空または完全ではない場合Image.open("tides.gif")IOError(サイズが 0 kB の tites.gif ファイルが原因で) が発生します。

urlretrieve(imgUrl, "tides.gif")のステータスを確認して、ステートメントが正常に完了した後にのみプログラムを進めるにはどうすればよいですか?

4

5 に答える 5

5

Requests は urllib よりも優れていますが、これを実行してファイルを同期的にダウンロードできるはずです。

import urllib
f = urllib.urlopen(imgUrl)
with open("tides.gif", "wb") as imgFile:
    imgFile.write(f.read())
# you won't get to this print until you've downloaded
# all of the image at imgUrl or an exception is raised
print "Got it!"

これの欠点は、ファイル全体をメモリにバッファリングする必要があるため、一度に大量の画像をダウンロードすると、大量の RAM を使用することになる可能性があることです。可能性は低いですが、知っておく価値はあります。

于 2012-07-21T19:21:54.193 に答える
2

プレーンなurllib2の代わりに、 http: //docs.python-requests.org/en/latest/index.htmlからのPythonリクエストを使用します。リクエストはデフォルトで同期されているため、最初に画像を取得せずに次のコード行に進むことはありません。

于 2012-07-21T19:13:22.963 に答える
0

私はここで同様の質問を見つけました: なぜ「raiseIOError( "画像ファイルを識別できません")」が一部の時間しか表示されないのですか?

具体的には、質問の答えを見てください。ユーザーは、複数の方法で問題を解決する方法を正確に説明している他のいくつかのスレッドを指しています。あなたが興味を持っているかもしれない最初のものは、プログレスバーの表示を含みます。

于 2012-07-21T19:09:31.590 に答える
0

以下でこれを試すことができます:

import time

# ----------------------------------------------------
# Wait until the end of the download
# ----------------------------------------------------

valid=0
while valid==0:
    try:
        with open("tides.gif"):valid=1
    except IOError:
        time.sleep(1)

print "Got it !"

# ----------------------------------------------------
# //////////////////////////////////////////////////
# ----------------------------------------------------
于 2017-05-20T16:17:49.020 に答える