Python(3.5) - urllib.request.urlopen - 进度条可用吗?

时间:2016-12-12 17:50:18

标签: python urllib python-3.5

我正在尝试在万维网上搜索这个答案,但我觉得答案可能不是。我正在使用Python 3.5和名为urllib.request的库以及一个名为urllib.request.urlopen(url)的方法来打开链接并下载文件。

由于文件超过200MB,因此可以对此进行某种程度的测量。我正在查看API here,并且看不到任何带钩子的参数。

这是我的代码:

downloadURL = results[3] #got this from code earlier up
rel_path = account + '/' + eventID + '_' + title + '.mp4'

filename_abs_path = os.path.join(script_dir, rel_path)
print('>>> Downloading >>> ' + title)

# Download .mp4 from a url and save it locally under `file_name`:
with urllib.request.urlopen(downloadURL) as response, open(filename_abs_path, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

如果有人认为我可能有进度条或者唯一的方法是使用不同的库,那么任何人都可以提供见解吗?我希望保持代码简短,简单,我只需要指示正在下载的文件。感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:2)

@tdelaney的答案很好,但是在Python 3.8中,您必须使用getvalue()方法而不是read():

    import io, urllib.request

    with urllib.request.urlopen(Url) as Response:
        Length = Response.getheader('content-length')
        BlockSize = 1000000  # default value

        if Length:
            Length = int(Length)
            BlockSize = max(4096, Length // 20)

        print("UrlLib len, blocksize: ", Length, BlockSize)

        BufferAll = io.BytesIO()
        Size = 0
        while True:
            BufferNow = Response.read(BlockSize)
            if not BufferNow:
                break
            BufferAll.write(BufferNow)
            Size += len(BufferNow)
            if Length:
                Percent = int((Size / Length)*100)
                print(f"download: {Percent}% {Url}")

        print("Buffer All len:", len(BufferAll.getvalue()))

答案 1 :(得分:1)

如果响应包含Dim xName As Range Set xName = ThisWorkbook.Names("Product").RefersToRange.SpecialCells(xlCellTypeVisible) Debug.Print xName.Count Debug.Print xName(3) ,您可以读取块中的传入数据并计算完成百分比。不幸的是,“chunk”响应的Web服务器并不总是提供内容长度,因此它并不总是有效。这是一个测试的例子。

content-length