这里有一个版本,将该文件下载到 bytearray
在一个单独的螺纹。
中提到的其他答复和意见,还有其他alternativs是开发异步操作中心,所以不要读得太多的进入决定去 threading
它只是证明了的概念(因为方便,因为它涉及与python).
在以下代码,如果大小的文件,是已知的,每 .
会有对应到1%。 作为奖励,下载总数的字节将印在开始的线喜欢 (1234 B / 1234567 B)
. 如果大小不知道,采用备选方案是有每 .
代表一个大块。
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
文件结束时(或写作的大块的文件,因为他们收到如果文件是大),但是请记住,你可能想要使用锁,以及如果你阅读和/或写信给同一文件中的任何其他部分的你的脚本。