如何打印的"点"(或其他种类的反馈)而编写的文件蟒蛇?

0

的问题

我想打印一个可见的反馈,用于在用户终端,同时我应用程序donwloads文件的网页,并把它写成硬盘驱动器,但我不能找到如何做到这一点读取文件或谷歌上搜索它。

这是我的代码:

res = requests.get(url_to_file)
with open("./downloads/%s" % (file_name), 'wb') as f:
    f.write(res.content)

我期待到弄清楚如何做到这样的事情:

Downloading file ........
 # it keeps going ultil the download is finished and the file writen
Done!

我真的strugling甚至开始,因为没有任何的方法返回的"承诺"(像在JS).

任何帮助将是非常apreciated! 谢谢!

file promise python
2021-11-24 05:40:54
2

最好的答案

3

requests.get 通过默认下载的全部内容的请求的资源之前会回到你。 然而,它有一个可选择的论点 stream,其中允许援引你 .iter_content.iter_linesResponse 对象。 这可以让你采取行动的每N字节(或作为每个区块的数据达),或者在每个线,分别。 事情是这样的:

chunks = []
chunk_size = 16384     # 16Kb chunks
# alternately
# chunk_size = None    # whenever a chunk arrives
res = requests.get(url_to_file, stream=True)
for chunk in res.iter_content(chunk_size):
    chunks.append(chunk)
    print(".", end="")
data = b''.join(chunks)

这仍然块不过,所以没什么将发生的事情。 如果你想要更多的JavaScript风格,每Grismar的评论,应在其下运行的蟒蛇是异步的循环。 在这种情况下,我建议使用 aiohttp 而不是 requests因为它是创建有异式记在心。

2021-11-24 06:52:04

谢谢你这么多你的答案! 这是非常快! 哈哈我们理解及该概念及其良好的要知道有异功能蟒蛇。 由于某些原因当我试图将收取你的代码,就只有印刷文件的请求之后已经完成。 可能我失去了一些东西...
guilfer
1

这里有一个版本,将该文件下载到 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 文件结束时(或写作的大块的文件,因为他们收到如果文件是大),但是请记住,你可能想要使用锁,以及如果你阅读和/或写信给同一文件中的任何其他部分的你的脚本。

2021-11-24 05:57:53

这是要命! 我想我理解这个概念,但我相当新的python和我决定去容易的,哈哈我是你的书签answaer并尽快了解更多关于穿我肯定会revesit它! 非常感谢!
guilfer

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................