requests
を使用してファイルをダウンロードしていますが、大きなファイルの場合、進行状況をパーセンテージで表示できず、ダウンロード速度も知りたいので、毎回ディスク上のファイルのサイズを確認する必要があります。 。どうすればそれを行うことができますか?これが私のコードです:
import requests
import sys
import time
import os
def downloadFile(url, directory) :
localFilename = url.split('/')[-1]
r = requests.get(url, stream=True)
start = time.clock()
f = open(directory + '/' + localFilename, 'wb')
for chunk in r.iter_content(chunk_size = 512 * 1024) :
if chunk :
f.write(chunk)
f.flush()
os.fsync(f.fileno())
f.close()
return (time.clock() - start)
def main() :
if len(sys.argv) > 1 :
url = sys.argv[1]
else :
url = raw_input("Enter the URL : ")
directory = raw_input("Where would you want to save the file ?")
time_elapsed = downloadFile(url, directory)
print "Download complete..."
print "Time Elapsed: " + time_elapsed
if __name__ == "__main__" :
main()
そのための1つの方法は、for
ループで毎回ファイルを読み取り、ヘッダーContent-Length
に基づいて進行状況のパーセンテージを計算することだと思います。しかし、それは大きなファイル(約500MB)の場合も問題になります。それを行う他の方法はありますか?
ここを参照してください: Pythonプログレスバーとダウンロード
コードは次のようになると思います。開始以降の平均速度をバイト/秒で表示する必要があります。
import requests
import sys
import time
def downloadFile(url, directory) :
localFilename = url.split('/')[-1]
with open(directory + '/' + localFilename, 'wb') as f:
start = time.clock()
r = requests.get(url, stream=True)
total_length = r.headers.get('content-length')
dl = 0
if total_length is None: # no content length header
f.write(r.content)
else:
for chunk in r.iter_content(1024):
dl += len(chunk)
f.write(chunk)
done = int(50 * dl / total_length)
sys.stdout.write("\r[%s%s] %s bps" % ('=' * done, ' ' * (50-done), dl//(time.clock() - start)))
print ''
return (time.clock() - start)
def main() :
if len(sys.argv) > 1 :
url = sys.argv[1]
else :
url = raw_input("Enter the URL : ")
directory = raw_input("Where would you want to save the file ?")
time_elapsed = downloadFile(url, directory)
print "Download complete..."
print "Time Elapsed: " + time_elapsed
if __name__ == "__main__" :
main()
io.Bytes
(メモリへの書き込み)を使用したpython3で受け入れられた回答の改良版は、Mbps、ipv4
/ipv6
のサポート、サイズとポートの引数をもたらします。
def speed_test(size=5, ipv="ipv4", port=80):
import sys, time, io, requests
if size == 1024:
size = "1GB"
else:
size = f"{size}MB"
url = f"http://{ipv}.download.thinkbroadband.com:{port}/{size}.Zip"
with io.BytesIO() as f:
start = time.clock()
r = requests.get(url, stream=True)
total_length = r.headers.get('content-length')
dl = 0
if total_length is None: # no content length header
f.write(r.content)
else:
for chunk in r.iter_content(1024):
dl += len(chunk)
f.write(chunk)
done = int(30 * dl / int(total_length))
sys.stdout.write("\r[%s%s] %s Mbps" % ('=' * done, ' ' * (30-done), dl//(time.clock() - start) / 100000))
print( f"\n{size} = {(time.clock() - start):.2f} seconds")
使用例:
speed_test()
speed_test(10)
speed_test(50, "ipv6")
speed_test(1024, port=8080)
出力サンプル:
[==============================] 61.34037 Mbps
100MB = 17.10 seconds
利用可能なオプション:
サイズ:5, 10, 20, 50, 100, 200, 512, 1024
ipv:ipv4, ipv6
ポート:80, 81, 8080