【问题标题】:How can I prevent requests.Response.iter_content() from repeatedly printing the chunk size?如何防止 requests.Response.iter_content() 重复打印块大小?
【发布时间】:2021-06-18 17:42:54
【问题描述】:

我正在使用请求来下载响应,如下所示:

resp = requests.get(url, stream=True)

# to local file
with open(valid_filename, "wb") as file_writer:
    for chunk in resp.iter_content(1024):
        file_writer.write(chunk)

# to google bucket blob
blob = gs_bucket.blob(filename)
with blob.open("wb") as blob_writer:
    for chunk in resp.iter_content(1024):
        blob_writer.write(chunk)

这两种方法都会导致在迭代响应时重复输出 chunk_size (1024)。

>>> with open(r"C:\Users\me\Downloads\xl_resp.xlsx", "wb") as file_writer:
    for chunk in xl_resp.iter_content(1024):
        file_writer.write(chunk)
        
1024
1024
...
1024
471

>>> with blob.open("wb") as blob_writer:
    for chunk in resp.iter_content(1024):
        blob_writer.write(chunk)

1024
1024
...
1024
471

如何防止这种行为?

【问题讨论】:

  • 您是否在 IDE 提供的交互式解释器中运行这些代码片段?因为这看起来像是来自 write 调用的返回值,它们是由过度热情的 REPL 打印的,而不是来自 iter_content 本身的任何内容。我不认为普通的 REPL 会这样做(循环中的表达式语句的返回值被忽略,只打印顶级表达式语句的结果)。
  • 啊,有道理!是的,这是来自与 python 安装一起打包的 IDLE。在决定如何实现一些逻辑之前,我只是在运行一些测试。

标签: python python-3.x python-requests


【解决方案1】:

您看到的打印出来的数字不是由您自己的任何代码打印的。相反,它们是您在循环中进行的write 调用所产生的return 值。

如果您将代码作为脚本运行,则输出不会显示,即使在大多数交互式会话中,您也不会看到它们。但是,与 Python 一起打包的 IDLE IDE 具有异常激进的 REPL(读取、评估、打印循环)。它不仅在顶层打印出表达式语句的结果(普通 Python 交互式解释器的行为方式)。它打印出像你这样的循环中出现的表达式语句的值。

如果您需要在 IDLE 中运行此代码并且不希望输出,您可以将返回值分配给某个变量:

bytes_written = file_writer.write(chunk)

但是,如果您在“真正”运行此代码时不打算使用 IDLE,您现在可以简单地忽略输出。如果您将代码作为脚本运行(即使在 IDLE 的编辑器中也不行),它将不会被打印出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2021-12-21
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多