【问题标题】:HTTP response content length w gzipHTTP 响应内容长度 w gzip
【发布时间】:2015-04-30 14:31:15
【问题描述】:

我正在使用 Python 的 requests 库发出 get 请求并将内容流式传输到文件中。我想通过将进度条的最大值设置为 resp.headers['content-length'] 并使用 chunksize=1 字节(response.iter_content(chunk_size=1))迭代响应来添加进度条。但是,响应的内容编码是 gzip,所以内容长度是指压缩后的大小。

使用以下代码:

resp = requests.get(...., stream=True)
count = 0
for x in resp.iter_content(chunk_size=1):
  count += 1

我得到:count=64 和 resp.headers['content-length'] = 127。

我应该使用什么作为进度条的最大值?

【问题讨论】:

    标签: python stream gzip python-requests content-length


    【解决方案1】:

    我会使用 Kenneth 的 clint 并这样做。 或者您应该做的是将进度条的实现设置为从 127 开始更新。

    from clint.textui import progress
    import requests
    
    
    resp = requests.get(url, stream=True)
    total_length = int(resp.headers.get('content-length'))
    
    for chunk in progress.bar(resp.iter_content(chunk_size=1), expected_size=(total_length / 1) + 1):
        pass
    

    【讨论】:

    • 这并没有解决我的问题,即 resp.headers.get('content-length') = 127 不等于迭代次数(count=64)。进度条库和实现无关
    • 根据请求内部,它会自动解码 gzip。迭代内容时的错误 content_length 很难调试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多