Проверьте для `urllib.urlretrieve (url, имя_файла)` Статус завершения

Как проверить, urllib.urlretrieve(url, file_name) ли 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") файл, Image.open("tides.gif") повышает IOError (из-за файла tides.gif размером 0 kB).

Как я могу проверить статус urlretrieve(imgUrl, "tides.gif") , позволяя моей программе продвигаться только после того, как заявление успешно завершено?

Запросы лучше, чем 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!" 

Недостатком этого является необходимость буферизации всего файла в памяти, поэтому, если вы загружаете сразу много изображений, вы можете использовать тонну бара. Это маловероятно, но все же стоит знать.

Я бы использовал запросы python от http://docs.python-requests.org/en/latest/index.html вместо простого urllib2. запросы по умолчанию синхронны, поэтому он не будет переходить к следующей строке кода, не получая сначала изображение.

Я нашел здесь аналогичный вопрос: почему «повысить IOError (« невозможно определить файл изображения »)« показывается только часть времени?

Чтобы быть более конкретным, посмотрите на ответ на вопрос. Пользователь указывает на пару других потоков, которые объясняют, как решить проблему несколькими способами. Первый, который может вас заинтересовать, включает отображение индикатора выполнения.

Выбранный ответ не работает с большими файлами. Вот правильное решение:

 import sys import time import urllib def reporthook(count, block_size, total_size): if int(count * block_size * 100 / total_size) == 100: print 'Download completed!' def save(url, filename): urllib.urlretrieve(url, filename, reporthook) 

вы можете попробовать это ниже:

 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 !" # ---------------------------------------------------- # ////////////////////////////////////////////////// # ----------------------------------------------------