python实现文件断点下载

2023-05-16

1.需求: 实现文件的断点下载

2.实现:

#!/usr/bin/python
# encoding=utf-8
import requests, sys, os, re, time


class download:
    def __init__(self, config={}):
        self.config = {
            'block': int(config['block'] if 'block' in config else 1024),
        }
        self.total = 0
        self.size = 0
        self.filename = ''

    def touch_file(self, filename):
        with open(filename, 'w') as f:
            pass

    def remove_nonchars(self, name):
        (name, _) = re.subn(r'[\\\/\:\*\?\"\<\>\|]', '', name)
        return name

    def support_continue(self, url):
        headers = {'Range': 'bytes=0-4'}
        try:
            res = requests.head(url, headers=headers)
            crange = res.headers['content-range']
            self.total = int(re.match(r'^bytes 0-4/(\d+)$', crange).group(1))
            return True
        except:
            pass
        try:
            self.total = int(res.headers['content-length'])
        except:
            self.total = 0
        return False

    def download(self, url, filename, headers={}):
        finished = False
        block = self.config['block']
        local_filename = self.remove_nonchars(filename)  # 移除文件名称中的特殊字符
        tmp_filename = local_filename + '.tmp'
        size = self.size
        if self.support_continue(url):  # 支持断点续传
            try:
                with open(tmp_filename, 'rb') as f:
                    self.size = int(f.read())
                    size = self.size + 1
            except:
                self.touch_file(tmp_filename)
            finally:
                headers['Range'] = "bytes=%d-" % self.size
                sys.stdout.write('\nlast download size: %s!\nthe start index for this time is: %s\n' % (self.size, size))
                sys.stdout.flush()
        else:
            self.touch_file(tmp_filename)
            self.touch_file(local_filename)

        try:
            res = requests.get(url, stream=True, verify=False, headers=headers)
        except Exception as e:
            sys.stdout.write('\ndownload failed: %s!\n' % (str(e)))
            sys.stdout.flush()
            os.remove(tmp_filename)
            os.remove(local_filename)
            return

        start_t = time.time()
        with open(local_filename, 'ab+') as f:
            f.seek(self.size)
            f.truncate()
            try:
                for chunk in res.iter_content(chunk_size=block):
                    if chunk:
                        f.write(chunk)
                        size += len(chunk)
                        f.flush()
                    sys.stdout.write('\b' * 64 + 'Now: %d, Total: %s' % (size, self.total))
                    sys.stdout.flush()
                finished = True
                os.remove(tmp_filename)
                spend = int(time.time() - start_t)
                speed = int((size - self.size) / 1024 / spend)
                sys.stdout.write('\nDownload Finished!\nTotal Time: %ss, Download Speed: %sk/s\n' % (spend, speed))
                sys.stdout.flush()
            except Exception as e:
                sys.stdout.write("\nDownload pause, reason: %s\n", str(e))
                sys.stdout.flush()
            finally:
                if not finished:
                    with open(tmp_filename, 'wb') as tmp:
                        tmp.write(bytes(str(size), encoding="utf-8"))


if __name__ == '__main__':
    url = "https://yos.yingzi.com/prod-bucket-iot/prod-iot-storage/979743213606400000/BH220_RK_123025080.diff"
    filename = url.split('/')[-1]
    download().download(url, filename)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现文件断点下载 的相关文章

  • ubuntu20.04搭建QGC4.2编译环境

    文章目录 前言 一 安装qt 二 编译QGC 安装依赖 安装GStreamer 三 编译安卓版QGC 安装jdk11 配置Qt creator 配置手机 配置遥控器 常见报错 前言 Ubuntu20 04 QGC 4 2 ubuntu18
  • PX4实战之旅(三):通过OFFBOARD模式控制无人机自主飞行

    文章目录 前言 一 添加自定义模块 二 测试 前言 固件 PX4 1 13 1 一 添加自定义模块 在PX4 Autopilot src modules目录下新建control node文件夹 在control node文件夹下新建下面四个
  • QGC二次开发基础

    文章目录 前言 一 添加文件到QGC工程 二 添加界面 三 QML和C 交互 四 信号与槽 五 测试 前言 QGC 4 2 4 一 添加文件到QGC工程 在qgroundcontrol src目录下创建SimpleTest文件夹 在文件夹中
  • windos10安装QGC4.2编译环境

    文章目录 前言一 安装VS二 安装QT三 编译四 常见报错及解决办法 前言 参考链接 https dev qgroundcontrol com master en getting started 一 安装VS 下载地址 xff1a http
  • PX4入门指南

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4基本配置

    目录 下载固件 下载原生稳定版固件 安装PX4 Master Beta或自定义固件 FMUv2 Bootloader 更新 机架设置 飞行控制器 传感器方向 计算朝向 设置朝向 罗盘校准 执行校准 陀螺仪校准 执行校准 加速度计 执行校准
  • VNCVIEW以LXDE环境连接Ubuntu12.04

    问题 xff1a 之前装了好几个桌面环境 xff0c 连接时只默认使用第一个桌面环境 xff0c 表示很郁闷 之前总以为命令是lxde开头的 xff0c 刚才又搜索了一下 xff0c 发现是startlxde 编辑 vnc xstartup
  • PX4飞行测试

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4飞行模式

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4实战之旅(五):利用T265实现室内定点飞行

    文章目录 前言一 相机安装二 安装Realsense驱动三 安装VIO桥接包四 配置摄像头方向五 运行VIO六 通过MAVROS连接地面站PX4设置 前言 硬件 xff1a Intel NUC Intel Realsense T265 Pi
  • windos安装mission planner地面站

    官网地址 https ardupilot org planner 可以直接点击下载 或者从网盘下载 链接 xff1a https pan baidu com s 1SkMIzohJRO25GWbo J944A 提取码 xff1a nw1s
  • PX4从放弃到精通(二十七):固定翼姿态控制

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 前言 固件版本 PX4 1 13 2 欢迎交流学习 xff0c 可加左侧名片 一 roll pitch姿态 角速率控制
  • PX4无人机调参

    文章目录 前言 一 滤波参数 二 PID参数 自动调参 手动调参 角速率环 姿态环 前言 PX4 1 13 2 日志分析软件 flight review https logs px4 io 一 滤波参数 调参时可以用自稳模式飞行 在调滤波器
  • Postman学习(一)下载安装与汉化教程

    1 postman下载 下载网址 xff1a Download Postman 打开网址 xff0c 下载64位安装包 2 postman安装 打开安装包后默认安装成功 xff0c 默认安装地址是 xff1a C Users 用户名 App
  • (UART/SPI/IIC) 与 (WIFI/蓝牙/Zigbee) 与 (TCP/IP/UDP)等协议精讲

    这三块内容有相同的地方 xff0c 也有不同的地方 xff0c 使用过程中密不可分 就一块单片机来讲 xff1a 其板子上主控芯片 xff08 MCU xff09 和其他芯片之间 xff0c 通信属于用的是UART SPI IIC等协议 x
  • IIC总线最多可以挂多少个设备

    由IIC地址决定 xff0c 8位地址 xff0c 减去1位广播地址 xff0c 是7位地址 xff0c 2 7 61 128 xff0c 但是地址0x00不用 xff0c 那就是127个地址 xff0c 所以理论上可以挂127个从器件 但
  • TortoiseGit 安装使用

    1 首先安装 windows版的git xff08 类似linux的命令行工具 xff09 Git for Windows 反正安装我除了路径都是选下一步的 Git安装教程 xff08 windows xff09 战争热诚 博客园 安装完之
  • ORB-SLAM3结合RealSense D455相机实时运行&离线官方样例测试部署

    文章目录 前言编译环境配置环境1 C 43 43 112 Pangolon3 Eigen34 DBoW2 and g2o5 ORB SLAM36 ROS7 librealsense8 相机驱动realsense ros9 ROS测试环境10
  • Ubuntu18.04安装ROS Melodic(包含初始化和更新问题)

    前期工作 xff1a 去软件更新那儿把源换成国内的 xff0c 比如清华源 正题 xff01 xff01 xff01 1 设置软件源 xff0c 国内的比较快 sudo sh c 39 etc lsb release amp amp ech
  • pitch、yaw、roll三个角的区别(yaw angle 偏航角,steering angle 航向角的解释)

    本文章参考https blog csdn net a812073479 article details 100103442 以下分析以此坐标系为标准 xff1a Z轴正方向为前进方向 pitch xff1a 俯仰 xff0c 将物体绕X轴旋

随机推荐