python - 下载 Python 3 的进度条

标签 python python-3.x download progress-bar

我需要在 Python 3 的文件下载期间显示进度。 我在 Stackoverflow 上看过一些主题,但考虑到我是编程新手,没有人发布完整的示例,只是其中的一部分,或者我可以在 Python 3 上工作的示例,没有一个对我有好处。 .

附加信息:

好的,所以我有这个:

from urllib.request import urlopen
import configparser
#checks for files which need to be downloaded
print('    Downloading...')
file = urlopen(file_url)
#progress bar here
output = open('downloaded_file.py','wb')
output.write(file.read())
output.close()
os.system('downloaded_file.py')

脚本通过python命令行运行

最佳答案

urlretrieve()将 url 下载到文件并允许指定 reporthook 回调以报告进程:

#!/usr/bin/env python3
import sys
from urllib.request import urlretrieve

def reporthook(blocknum, blocksize, totalsize):
    readsofar = blocknum * blocksize
    if totalsize > 0:
        percent = readsofar * 1e2 / totalsize
        s = "\r%5.1f%% %*d / %d" % (
            percent, len(str(totalsize)), readsofar, totalsize)
        sys.stderr.write(s)
        if readsofar >= totalsize: # near the end
            sys.stderr.write("\n")
    else: # total size is unknown
        sys.stderr.write("read %d\n" % (readsofar,))

urlretrieve(url, 'downloaded_file.py', reporthook)

这是一个 GUI 进度条:

import sys
from threading import Event, Thread
from tkinter import Tk, ttk
from urllib.request import urlretrieve

def download(url, filename):
    root = progressbar = quit_id = None
    ready = Event()
    def reporthook(blocknum, blocksize, totalsize):
        nonlocal quit_id
        if blocknum == 0: # started downloading
            def guiloop():
                nonlocal root, progressbar
                root = Tk()
                root.withdraw() # hide
                progressbar = ttk.Progressbar(root, length=400)
                progressbar.grid()
                # show progress bar if the download takes more than .5 seconds
                root.after(500, root.deiconify)
                ready.set() # gui is ready
                root.mainloop()
            Thread(target=guiloop).start()
        ready.wait(1) # wait until gui is ready
        percent = blocknum * blocksize * 1e2 / totalsize # assume totalsize > 0
        if quit_id is None:
            root.title('%%%.0f %s' % (percent, filename,))
            progressbar['value'] = percent # report progress
            if percent >= 100:  # finishing download
                quit_id = root.after(0, root.destroy) # close GUI

    return urlretrieve(url, filename, reporthook)

download(url, 'downloaded_file.py')

在 Python 3.3 上 urlretrieve() 有不同的 reporthook 接口(interface) ( see issue 16409 )。要解决此问题,您可以通过 FancyURLopener 访问以前的界面:

from urllib.request import FancyURLopener
urlretrieve = FancyURLopener().retrieve

要在同一个线程中更新进度条,您可以内联 urlretrieve() 代码:

from tkinter import Tk, ttk
from urllib.request import urlopen

def download2(url, filename):
    response = urlopen(url)
    totalsize = int(response.headers['Content-Length']) # assume correct header
    outputfile = open(filename, 'wb')

    def download_chunk(readsofar=0, chunksize=1 << 13):
        # report progress
        percent = readsofar * 1e2 / totalsize # assume totalsize > 0
        root.title('%%%.0f %s' % (percent, filename,))
        progressbar['value'] = percent

        # download chunk
        data = response.read(chunksize)
        if not data: # finished downloading
            outputfile.close()
            root.destroy() # close GUI
        else:
            outputfile.write(data) # save to filename
            # schedule to download the next chunk
            root.after(0, download_chunk, readsofar + len(data), chunksize)

    # setup GUI to show progress
    root = Tk()
    root.withdraw() # hide
    progressbar = ttk.Progressbar(root, length=400)
    progressbar.grid()
    # show progress bar if the download takes more than .5 seconds
    root.after(500, root.deiconify)
    root.after(0, download_chunk)
    root.mainloop()

download2(url, 'downloaded_file.py')

关于python - 下载 Python 3 的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881092/

相关文章:

python内存错误(有足够的可用内存)

python-3.x - 使用 `pip3` 安装了 python 包,但是当我调用它时,我得到 "No module named X"

android - 从 Url 下载 pdf 并将其保存到 SD 卡

python - 如何在 qtextbox 中显示 json 数据

python - 动态定义具有不同签名的函数

python - 我应该在 __init__ 完成之前在成员函数中使用实例变量吗?

python - 如果嵌套列表中不存在元素,如何有效地检查和添加?

python - 将值移出对象

python - 如何在 biopython entrez.esearch 中下载完整的基因组序列

Java - 下载网页源 html 的最佳方式