Python http下载使用requests.get始终缺少块

Python http下载使用requests.get始终缺少块,python,download,python-requests,Python,Download,Python Requests,我试图定义一个函数,如果连接中断,它将恢复下载。但是,以下操作并不像预期的那样有效。 在第8行中,我必须手动推断一个块大小,以使其正常工作,否则,每次我恢复最终文件时,它都会丢失一个块大小 if os.path.exists(fileName): header = requests.head(url) fileLength = int(header.headers['Content-Length']) if fileLength == os.path.getsize(fi

我试图定义一个函数,如果连接中断,它将恢复下载。但是,以下操作并不像预期的那样有效。 在第8行中,我必须手动推断一个块大小,以使其正常工作,否则,每次我恢复最终文件时,它都会丢失一个块大小

if os.path.exists(fileName):
    header = requests.head(url)
    fileLength = int(header.headers['Content-Length'])
    if fileLength == os.path.getsize(fileName):
        return True
    else:
        with open(fileName, 'ab') as f:
            position = f.tell()-1024
            pos_header = {}
            print(position)
            pos_header['Range'] = f'bytes={position}-'

        with requests.get(url, headers = pos_header, stream = True) as r:
            with open(fileName, 'ab') as f:
                    #some validation should be here

                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(r.content)
                        f.flush()
                        print(os.path.getsize(fileName))

else:
    with requests.get(url, allow_redirects=True, stream = True) as r:
        with open(fileName, 'wb') as f:
            iter = 0
            for chunk in r.iter_content(chunk_size = 1024):
                if chunk:
                    f.write(chunk)
                    f.flush()
                    iter += 1
                if iter > 2000:
                    break

有趣的是,缺少的部分位于下载的两部分之间。有没有比我所做的更优雅的方法来解决这个问题?

如果是第二次尝试,代码中会有一个bug下载文件的“其余部分”。错误出现在以下行中:

f.write(r.content)
应该是

f.write(chunk)

基本上,你是在重复块,但写整个内容,这会把事情搞砸

如果是第二次尝试,下载文件“其余部分”的代码中有一个bug。错误出现在以下行中:

f.write(r.content)
应该是

f.write(chunk)

基本上,你是在重复块,但写整个内容,这会把事情搞砸

你有没有一个页面可以让你轻松地测试它?大多数页面没有内容长度。是的,在url=''处找到了一个随机的10秒视频。它具有所需的所有https支持。您是否有允许轻松测试此功能的页面?大多数页面没有内容长度。是的,在url=''处找到了一个随机的10秒视频。它具有所需的所有https支持。