İşte dosyayı bir dosyaya indirecek bir sürüm bytearray
ayrı bir iş parçacığında.
Diğer cevaplarda ve yorumlarda belirtildiği gibi, zaman uyumsuz işlemler göz önünde bulundurularak geliştirilen başka alternatifler de vardır, bu nedenle karar verme kararını çok fazla okumayın threading
bu sadece kavramı göstermek içindir (ve python ile birlikte geldiği için kolaylık nedeniyle).
Aşağıdaki kodda, dosyanın boyutu biliniyorsa, her .
%1'e karşılık gelecektir. Bonus olarak, indirilen ve toplam bayt sayısı satırın başında aşağıdaki gibi yazdırılır (1234 B / 1234567 B)
. Boyut bilinmiyorsa, geri dönüş çözümü her birine sahip olmaktır .
bir parçayı temsil et.
import requests
import threading
def download_file(url: str):
headers = {"<some_key>": "<some_value>"}
data = bytearray()
with requests.get(url, headers=headers, stream=True) as request:
if file_size := request.headers.get("Content-Length"):
file_size = int(file_size)
else:
file_size = None
received = 0
for chunk in request.iter_content(chunk_size=2**15):
received += len(chunk)
data += chunk
try:
num_dots = int(received * 100 / file_size)
print(
f"({received} B/{file_size} B) "
+ "." * num_dots, end="\r"
)
except TypeError:
print(".", end="")
print("\nDone!")
url = "<some_url>"
thread = threading.Thread(target=download_file, args=(url,))
thread.start()
# Do something in the meantime
thread.join()
Eşzamanlı erişime karşı korumak için kilidi dışarıda bıraktığımı unutmayın. stdout
gürültüyü azaltmak için. Ayrıca yazmayı bıraktım bytarray
sonunda dosyalamak (veya dosya büyükse parçaları alındıkları gibi dosyaya yazmak), ancak komut dosyanızın başka bir bölümünde aynı dosyayı okuyup/veya yazarsanız bunun için de bir kilit kullanmak isteyebileceğinizi unutmayın.