Tady je verze, která bude ke stažení soubor do bytearray
v samostatném vlákně.
Jak již bylo zmíněno v jiné odpovědi a komentáře, tam jsou jiné alternativs, které jsou vyvíjeny s asynchronní operace v mysli, takže se nemusíte číst příliš do rozhodnutí jít s threading
je to jen prokázat koncept (a kvůli pohodlí, protože to je dodáván s python).
V níže uvedeném kódu, pokud velikost souboru je známo, každý .
bude odpovídat 1%. Jako bonus, stáhnout a celkový počet bajtů, které budou vytištěny na začátku řádku (1234 B / 1234567 B)
. Pokud velikost není známo, nouzový řešení je mít každý .
představují 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()
Mějte na paměti, že jsem nechal zámek na ochranu proti současný přístup k stdout
ke snížení hluku. Také jsem vynechal psaní bytarray
k souboru na konci (nebo psaní bloky k souboru, jak jsou přijímány, pokud soubor je velký), ale mějte na paměti, že možná budete chtít použít zámek na to, jak dobře, pokud budete číst a/nebo zapisovat do stejného souboru v jiné části skriptu.