首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对变量的请求+ Tqdm

对变量的请求+ Tqdm
EN

Stack Overflow用户
提问于 2022-03-13 17:34:29
回答 1查看 369关注 0票数 0

我从这个问题 (ctrl+ f表示“有一个请求和tqdm的答案”)获得了这个函数:

代码语言:javascript
复制
import requests
from tqdm import tqdm
def download(url: str, fname: str):
    resp = requests.get(url, stream=True)
    total = int(resp.headers.get('content-length', 0))
    with open(fname, 'wb') as file, tqdm(
        desc=fname,
        total=total,
        unit='b',
        unit_scale=True,
        unit_divisor=1024,
    ) as bar:
        for data in resp.iter_content(chunk_size=1024):
            size = file.write(data)
            bar.update(size)

基本上,它下载一个文件并将其写到一个文件中,我希望它返回一个变量,该变量表示下载的文件,因此我做了如下操作:

代码语言:javascript
复制
def download(url: str, fname: str):
    import requests
    from tqdm import tqdm
    import os
    resp = requests.get(url, stream=True)
    total = int(resp.headers.get('content-length', 0))
    with open(fname, 'wb') as file, tqdm(
        desc=fname,
        total=total,
        unit='b',
        unit_scale=True,
        unit_divisor=1024,
    ) as bar:
        for data in resp.iter_content(chunk_size=1024):
            size = file.write(data)
            bar.update(size)
    with open(fname, "rb") as f:
        returned = f.read()
    os.remove(fname)
    return returned

现在,它保存文件,读取文件并将其保存到变量中,删除文件并返回变量。有什么方法可以直接将它保存到变量中吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-13 17:40:23

那么,您可以只返回一个tqdm迭代器,并对块执行您喜欢的任何操作:

代码语言:javascript
复制
import requests
import tqdm
import io

def download(url: str):
    resp = requests.get(url, stream=True)
    total = int(resp.headers.get('content-length', 0))
    with tqdm.tqdm(
        desc=url,
        total=total,
        unit='b',
        unit_scale=True,
        unit_divisor=1024,
    ) as bar:
        for chunk in resp.iter_content(chunk_size=65536):
            bar.update(len(chunk))
            yield chunk

bio = io.BytesIO()

for chunk in download('http://...'):
    # Do something with the chunk; this just stores it in memory.
    bio.write(chunk)

content = bio.getvalue()  # Get the contents of the BytesIO() as a bytes.

当然,您可以将其重构为

代码语言:javascript
复制
import requests
import tqdm
import io


def download_as_bytes_with_progress(url: str) -> bytes:
    resp = requests.get(url, stream=True)
    total = int(resp.headers.get('content-length', 0))
    bio = io.BytesIO()
    with tqdm.tqdm(
        desc=url,
        total=total,
        unit='b',
        unit_scale=True,
        unit_divisor=1024,
    ) as bar:
        for chunk in resp.iter_content(chunk_size=65536):
            bar.update(len(chunk))
            bio.write(chunk)
    return bio.getvalue()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71459213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档