[python] progress bar na stahovanie velkeho suboru z githubu

ZdPo Ster zdposter na gmail.com
Úterý Květen 8 11:01:49 CEST 2018


Ahojte,

viem stiahnut velky subor z z githubu takto:

file_content = requests.get(file_url, allow_redirects=True)
file_data = base64.b64decode(file_content.content)
open(output, 'wb').write(file_data)

Kedze to dlho trva, chcem tam implementovat progressbar a tu zacinaju moje
problemy ;-). Nasiel som ze by malo fungovat nieco taketo:

file_size = 19335882  # toto viem vopred
req = requests.get(file_url, allow_redirects=True, stream=True)
block_size = 1024
num_bars = file_size / (block_size*2)
bar = Bar(f'Downloading {filename}', max=num_bars,
              suffix='%(percent).1f%% - %(eta)ds')
bytes_transferred = 0
with open(output, "wb") as file:
        for chunk in req.iter_content(chunk_size=block_size):
            bytes_transferred+= len(chunk)
            if chunk:
                file.write(chunk)
             bar.next()
    bar.finish()
print(bytes_transferred)

Moje problem: Velkost prenesenych dat nesedi s velkostou suboru (26640760
vs 19335882 t.j. progress bar nezobrazuje korektny progress) z dovodu, ze
github namiesto suboru posiela subor zabaleny v json a encodovany v base64.

Workaround by mohol byt, ze ak viem velkost finalneho suboru, pokusim sa
vypocitat velkost json filu (req.headers.get('Content-Length') v tomto
pripade na githube nefunguje :-( ). Z neho by som po stiahnuti do pamate
extrahoval content, dekodoval ho a az potom ulozil... Otazkou je ci nie je
inteligentnejsi sposob ako to urobit...

PS: moja testovacia url je:
https://api.github.com/repos/tesseract-ocr/tessdata/git/blobs/b01dab8de8174496a0012bf85296943b3e7c81d7


Zd.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20180508/48368cef/attachment.html>


Další informace o konferenci Python