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(由于潮汐.gif 文件大小为 0 kB)。

如何检查 的状态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!"

这样做的缺点是它需要将整个文件缓冲在内存中,因此如果您一次下载大量图像,您最终可能会使用大量内存。这不太可能,但仍然值得知道。

于 2012-07-21T19:21:54.193 回答
2

我会使用来自http://docs.python-requests.org/en/latest/index.html的 python 请求,而不是普通的 urllib2。requests 默认情况下是同步的,因此如果不先获取图像,它就不会进入下一行代码。

于 2012-07-21T19:13:22.963 回答
0

我在这里发现了一个类似的问题: 为什么“raise IOError("cannot identify image file")" 只显示部分时间?

更具体地说,请查看问题的答案。用户指向其他几个线程,这些线程准确地解释了如何以多种方式解决问题。您可能感兴趣的第一个包括进度条显示。

于 2012-07-21T19:09:31.590 回答
0

所选答案不适用于大文件。这是正确的解决方案:

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)
于 2014-06-04T21:35:29.087 回答
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 回答