首页 > 编程语言 >Python之断点续传下载及进度显示

Python之断点续传下载及进度显示

时间:2023-09-06 12:36:07浏览次数:45  
标签:断点续传 Python 进度 requests csv 下载 size

Python之断点续传下载及进度显示

某日,因工作需要下载大量OSGB数据, 下载链接来源于一个csv文件, 于是解析了csv文件然后下载。为了提高下载效率及进度显示,写了一份脚本。

环境

  • python 3.7
  • requests
  • csv

过程

解析csv

废话不多说, 先上代码:

def fetch_download_url(source):
    result = defaultdict(list)

    with open(source, encoding='utf-16') as fp:

        reader = csv.DictReader(fp, delimiter="\t")
        for row in reader:
            result[row['LOC_TC']].append(row['FILE_URL'])
    
    return result

代码逻辑简单, 打开csv文件, 通过csv模块解析指定列。 其中踩坑点在于文件编码, 笔者csv文件编码为UCS-2 LE BOM, 文件读取格式应设为utf-16。 utf-8与gbk都会报错。

下载

下载逻辑其实很简单, 一行代码:

requests.get('https://XXXXXXX')

断点续传

如果要做断点续传, 就需要用到流式传输:

resp = requests.get(url='https://XXXXXXX', stream=True)

设置关键字参数streamTrue

接下来将流数据写入到磁盘上:

with open(filepath, 'ab') as fp:
    for data in resp.iter_content(chunk_size=1024):
        fp.write(data)

以上代码通过iter_content按块下载,块大小由参数chunk_size指定,然后将下载后的数据库写入到文件中。

而要做到断点续传, 则需要指定下载的header

headers = {
            "Range": 'bytes=%d-' % total_size,
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"
    }
resp = requests.get(url='https://XXXXXXX', stream=True, headers=headers)

其中的Range指定了下载的其实字节位,即从指定字节处开始下载。

连接池

通过以下代码可以修改默认连接池大小10, 从而提高下载效率。具体原理此处暂不展开。

session = requests.Session()
session.mount("%s://"%(url.split(":")[0],), requests.adapters.HTTPAdapter(pool_connections=20, pool_maxsize=20))
response = session.get(url, stream=True, headers=headers)

进度显示

先看源码:

def display_progress(actual_size, total_size, mode):
    print("\r\tprogress:", end="")
    if mode == 0:
        print( "▋" * (50 *total_size//actual_size),"{:>6.2f}%".format((total_size/actual_size)*100), end="")
    else:
        print("[%d/%d]"%(total_size,actual_size), end="")

进度显示最核心的点在于如何在固定行打印进度,以上代码保证其能在固定行打印进度的核心在于打印\r,即将光标移动到一行的开始,再次打印将覆盖上一次打印的字符。

然后通过实际运行状态打印符号及百分比。代码中进度乘以50表示, 每2%显示一格进度。

效果

download

标签:断点续传,Python,进度,requests,csv,下载,size
From: https://www.cnblogs.com/quenwaz/p/17680761.html

相关文章

  • 使用python自动根据数据库的成品重量编写一个ppt并保存在"d:\test.ppt"
    要使用Python自动创建一个PPT并根据数据库中的成品重量生成内容,你可以使用Python的`python-pptx`库来实现。首先,你需要确保已经安装了这个库。你可以使用以下命令安装它:```pythonpipinstallpython-pptx```接下来,你可以按照以下步骤创建一个Python脚本来实现你的需求:```py......
  • Python 设置环境变量方法
    Python中的os模块Python中的os模块提供了很多与操作系统相关的功能。其中就包括设置环境变量的方法,即setenv()方法。使用os.setenv()方法设置环境变量importosos.setenv('VAR_NAME','VAR_VALUE')其中,VAR_NAME是环境变量的名称,VAR_VALUE是环境变量的值。这样我们就可以使用......
  • 向python脚本传递参数
    需要模块:sys参数个数:len(sys.argv)脚本名:   sys.argv[0]参数1:    sys.argv[1]参数2:    sys.argv[2]importsysprint"脚本名:",sys.argv[0]foriinrange(1,len(sys.argv)):print......
  • Python终端如何输出彩色字体
    实现过程:终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示就是033)。书写格式:开头部分\033[显示方式;前景色;背景色m+结尾部分:\033[0m注意:开头部分的三个参数:显......
  • python3.10及以上版本编译安装ssl模块(openssl)
    由于python3.10之后版本不在支持libressl使用ssl,需要使用openssl安装来解决编译安装python时候遇到的ssl模块导入失败的问题,这里需要用的openssl1.1.1版本或者更高版本在别人的博客查阅到资料,特此记录:https://blog.csdn.net/ye__mo/article/details/129436629?spm=1001.2101.30......
  • Centos通过yum安装python3
    首先通过yumsearchpython看是否有python3的包,然后再通过yuminstallpython36的命令安装配置pip国内源mkdir-p~/.pipvi~/.pip/pip.conf 添加以下内容[global]index-url=https://pypi.tuna.tsinghua.edu.cn/simple[install]trusted-host=pypi.tuna.tsinghua......
  • Python 遍历读取Word文档全部内容
    importdocxfromdocx.documentimportDocumentfromdocx.tableimport_Cell,Tablefromdocx.oxml.text.paragraphimportCT_Pfromdocx.text.paragraphimportParagraphfromdocx.oxml.tableimportCT_Tblimportpandasaspddoc=docx.Document('test.d......
  • Python第三章:程序控制结构
    1.range(a,b,c)  从a到b,不包括b,步长为c。2.random随机数  第一步:importrandom  生成从a到b的随机整数:random.randint(a,b)  生成从0到1的随机数:random()  生成从a到b,数量为c的数字:random.sample(range(a,b),c) 3.Python中的if、for、while都没有{},而是......
  • python函数的应用(一)九九乘法表
    函数实现99乘法表的打印#1.使用函数重构乘法口诀表并调用defmultiplication(n):foriinrange(1,n+1):forjinrange(1,i+1):print(j,"*",i,"=",j*i,end="\t")print()#调用函数a=int(input("请输入您想打印的乘法口诀表部分"))mult......
  • Python类属性与方法的使用
      #类属性与方法的使用classGoods:id_count=0#装饰器写法,@classmethod用来定义类方法@classmethoddefgenerate_id(cls):cls.id_count+=1returncls.id_countdef__init__(self):#商品的唯一序号,00001,00002,使用zfill......