복붙노트

[PYTHON] 파이썬 3을위한 progressbar 다운로드

PYTHON

파이썬 3을위한 progressbar 다운로드

파이썬 3에서 파일을 다운로드하는 동안 진행해야합니다. 나는 Stackoverflow에 관한 몇 가지 주제를 보았다.하지만 프로그래밍에 대한 멍청한 생각을 가진 사람은 아무도 완전한 예제를 게시하지 않았고, 파이썬 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')

스크립트는 파이썬 명령 줄을 통해 실행됩니다.

해결법

  1. ==============================

    1.url을 파일로 다운로드하고, reporthook 콜백을 지정하여 진행 상황을보고하는 urlretrieve ()가 있습니다.

    url을 파일로 다운로드하고, reporthook 콜백을 지정하여 진행 상황을보고하는 urlretrieve ()가 있습니다.

    #!/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')
    

    파이썬 3.3에서 urlretrieve ()는 서로 다른 reporthook 인터페이스를 가지고 있습니다 (문제 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')
    
  2. ==============================

    2.나는이 코드 조각이 당신을 도울 수 있다고 생각한다. 나는 그것이 당신이 원하는 것과 정확히 일치하지는 않습니다. 적어도 그것은 당신에게 일할 무언가를 주어야합니다.

    나는이 코드 조각이 당신을 도울 수 있다고 생각한다. 나는 그것이 당신이 원하는 것과 정확히 일치하지는 않습니다. 적어도 그것은 당신에게 일할 무언가를 주어야합니다.

    import tkinter 
    from tkinter import ttk
    from urllib.request import urlopen
    
    
    def download(event):
        file = urlopen('http://www.python.org/')
        output = open('downloaded_file.txt', 'wb')
        lines= file.readlines()
        i = len(lines)
    
        for line in lines:
            output.write(line)
            pbar.step(100/i)
    
        output.close()
        file.close()
    
    
    
    
    root = tkinter.Tk()
    root.title('Download bar')
    
    pbar = ttk.Progressbar(root, length=300)
    pbar.pack(padx=5, pady=5)
    
    btn = tkinter.Button(root, text="Download")
    # bind to left mouse button click
    btn.bind("<Button-1>", download)
    btn.pack(pady=10)
    
    root.mainloop()
    

    이 작품은, 나는 그것을 시도했습니다.

  3. from https://stackoverflow.com/questions/13881092/download-progressbar-for-python-3 by cc-by-sa and MIT license