Python3进度条和gzip下载

时间:2014-02-14 12:01:56

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

我对Python progress bar and downloads

中说明的答案有点疑问

如果下载的数据是gzip编码的,那么在for data in response.iter_content():中加入数据后的内容长度和数据的总长度会有所不同,因为它更大会自动解压缩gzip编码的响应

所以条形越来越长,一旦它变得长到一条线,就会开始充斥终端

问题的一个工作示例(该网站是我在google上找到的第一个同时获得内容长度和gzip编码的网站):

import requests,sys

def test(link):
    print("starting")
    response = requests.get(link, stream=True)
    total_length = response.headers.get('content-length')
    if total_length is None: # no content length header
        data = response.content
    else:
        dl = 0
        data = b""
        total_length = int(total_length)
        for byte in response.iter_content():
            dl += len(byte)
            data += (byte)
            done = int(50 * dl / total_length)
            sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)))
            sys.stdout.flush()
    print("total data size: %s,  content length: %s" % (len(data),total_length))

test("http://www.pontikis.net/")

ps,我在linux上,但它也应该影响其他操作系统(除了windows导致\ r \ n不能正常工作)i / s

我正在使用requests.Session进行cookie(和gzip)处理,所以urllib和其他模块的解决方案不是我想要的

3 个答案:

答案 0 :(得分:0)

也许你应该尝试禁用gzip压缩或以其他方式解决它。

为请求关闭它的方式(当您使用会话时):

import requests

s = requests.Session()
del s.headers['Accept-Encoding']

发送的标头现在为:Accept-Encoding: Identity,服务器不应尝试使用gzip压缩。如果你试图下载一个gzip编码的文件,你不应该遇到这个问题。您将收到Content-Type application/x-gzip-compressed。如果网站是gzip压缩的,那么您会收到Content-Type text/html例如Content-Encoding gzip

如果服务器总是提供压缩内容,那么你运气不好,但没有服务器应该这样做。


如果您想对请求的功能API执行某些操作:

import requests

r = requests.get('url', headers={'Accept-Encoding': None})

通过功能API(或甚至调用None)将标头值设置为session.get会从请求中删除该标头。

答案 1 :(得分:0)

你可以替换......

SELECT T1.Name, T1.Address, T2.Occupation, T2.Salary, T3.Model, T3.Make FROM TableA T1 INNER JOIN TableB T2 ON T1.Account_Number=T2.Account_Number INNER JOIN TableC T3 ON T2.Account_Number=T3.Account_Number /Do I need to join T3 to T1 or is this handled by having T1 and T2 joined together? WHERE ??.AccountNumber=1234123412341234 /Would any Table work in the WHERE clause here since we are all looking for the same account_number in each table?

...与:

dl += len(byte)

来自documentation

  

tell():获取到目前为止通过线路拉取的字节数。可以   与返回的内容量不同:meth:HTTPResponse.read   如果字节在线上编码(例如,压缩)。

答案 2 :(得分:0)

这是带有tqdm的简单过程栏工具:

def _reader_generator(reader):
    b = reader(1024 * 1024)
    while b:
        yield b
        b = reader(1024 * 1024)

def raw_newline_count_gzip(fname):
    f = gzip.open(fname, 'rb')
    f_gen = _reader_generator(f.read)
    return sum(buf.count(b'\n') for buf in f_gen)


num = raw_newline_count_gzip(fname)
(loop a gzip file):
    with tqdm(total=num_ids) as pbar:
        # do whatever you want
        pbar.update(1)

栏看起来像: 35%|███▌ | 26288/74418 [00:05<00:09, 5089.45it/s]