यहाँ एक संस्करण को डाउनलोड करेगा कि एक फ़ाइल के bytearray
में एक अलग धागा ।
के रूप में उल्लेख किया है, अन्य के जवाब और टिप्पणियों के लिए, वहाँ रहे हैं अन्य alternativs है कि विकसित कर रहे हैं के साथ async के संचालन के मन में है, तो पढ़ने के लिए नहीं बहुत ज्यादा में जाने के लिए निर्णय के साथ threading
, यह बस को प्रदर्शित करने के लिए अवधारणा (और क्योंकि सुविधा के बाद से, यह के साथ आता है अजगर).
में नीचे दिए गए कोड है, अगर इस फाइल के आकार में जाना जाता है, प्रत्येक .
अनुरूप होगा करने के लिए 1%. एक बोनस के रूप में, डाउनलोड किया है और कुल बाइट्स की संख्या में मुद्रित किया जाएगा के शुरू में लाइन की तरह (1234 B / 1234567 B)
. अगर आकार ज्ञात नहीं है, तो fallback समाधान है करने के लिए प्रत्येक .
का प्रतिनिधित्व एक हिस्सा.
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()
ध्यान में रखना है कि मैं बाहर छोड़ दिया ताला खिलाफ की रक्षा के लिए एक साथ उपयोग करने के लिए stdout
करने के लिए शोर को कम. मैं भी बाहर छोड़ दिया लेखन bytarray
करने के लिए फाइल के अंत में (या लेखन की मात्रा करने के लिए फाइल के रूप में वे प्राप्त कर रहे हैं, तो फ़ाइल बहुत बड़ी है), लेकिन मन में रखने के लिए हो सकता है कि आप उपयोग करना चाहते हैं के लिए एक ताला है कि के रूप में अच्छी तरह से अगर आप पढ़ सकते हैं और/या लिखने के लिए एक ही फ़ाइल के किसी अन्य हिस्से में अपनी स्क्रिप्ट.