Tu je verzia, ktorá sa stiahnuť súbor do bytearray
v samostatnom vlákne.
Ako už bolo spomenuté v iných odpovede a pripomienky, existujú aj iné alternativs, ktoré sú vyvinuté s asynchrónnej operácie v pamäti, takže sa nemusíte čítať príliš do rozhodnutia ísť s threading
je to len na preukázanie pojem (a preto, pohodlie, pretože prichádza s python).
V nižšie zákonníka, ak veľkosť súboru je známe, každý .
bude zodpovedať 1%. Ako bonus, stiahnutý a celkový počet bajtov, ktoré sa budú tlačiť na začiatku riadok (1234 B / 1234567 B)
. Ak veľkosť nie je známe, núdzové riešenie je mať každý .
predstavujú kus.
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()
Robiť udržať v pamäti, že som vynechal zámok na ochranu proti simultánny prístup k stdout
na zníženie hluku. Ja som tiež vynechané, písať bytarray
ak chcete súbor na konci (alebo písať kúsky do súboru, ako sú prijaté, ak súbor je veľký), ale majte na pamäti, že budete chcieť použiť zámok na tom, ako dobre, ak budete čítať a/alebo píšte na rovnaký súbor v akejkoľvek inej časti skriptu.