python批量下载文件并压缩后上传到owncloud

2023-11-16

摘要:笔者想下载东西到本地,直接下载速度超慢,一共需要下载1500张图,下载了1天才下载了45张,而且还会报错说请求超时,特绝望,也很无奈,主要原因还是图片储存的服务器在地球的另一边,直接进行传输显然速度很喜感,所以需要一个中转站,先把文件下载到中转服务器,然后再从中转服务器下载下来,笔者使用的是某歌作为文件中转站,某里云作为owncloud的服务器,文件传输如下图所示。

原来的文件传输示意图:
在这里插入图片描述
笔者使用的加速路径:
在这里插入图片描述
以下操作均在某歌服务器下进行:

1、首先获的一个保存url的文件

笔者将其保存为a.txt,该a.txt文件所在目录认为是当前目录,txt文件如下图所示:
在这里插入图片描述
在当前目录下创建data文件夹:

mkdir data

2、下载文件到服务器

运行以下脚本读取url文件,批量下载文件:

import requests


print ("downloading with requests")
i = 0
with open('./download','r') as f:
    #a = f.readline()
    for line in f:
        url = line[:-1] #去掉换行符
        name = url.split('/')[-1]
        r = requests.get(url)
        print(name)
        with open('./data/' + name, "wb") as code:
            code.write(r.content)
        i = i + 1
        print(i)

下载后进行压缩,保存为1.tar.gz:

tar -zcf 1.tar.gz ./data/

3、将文件上传到owncloud

先安装owncloud库

pip install pyocclient

3.1、上传单个文件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import datetime
import owncloud


class OwncloudUpload:
    """
    上传文件到owncloud网盘脚本
    """

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 网址
        self.url = 'https://www.icdlight.cn/owncloud'
        # 用户名
        self.username = 'your_username'
        # 密码
        self.password = 'your_password'
        # 上传文件父文件夹
        self.dic = 'lw'
        # 被上传的文件
        self.file = r'./1.tar.gz'

    def upload(self):

        owncloud_client = self.login()

        today_list = self.current_date()

        # 判断文件夹是否存在
        fold = self.dic
        for i in range(3):
            fold += '/' + today_list[i]

            try:
                owncloud_client.file_info(fold)
                print('Fold {} is exist.'.format(fold))
            except Exception as e:
                print('Fold {} is not exist.. HTTP error is: {}'.format(fold, e))
                self.creat_fold(owncloud_client, fold)

        # 在结尾添加'/',表示当前为文件夹
        fold += '/'
        # 上传文件
        print('Upload fold is {}.'.format(fold))
        self.upload_file(owncloud_client, fold, self.file)

    def creat_fold_owncloud(self, datestart="2019-07-18", dateend="2019-10-31"):

        owncloud_client = self.login()

        date_list = self.create_assist_date(datestart=datestart, dateend=dateend)
        for n in date_list:
            today_list = n.split('-')

            fold = self.dic
            for i in range(3):
                fold += '/' + today_list[i]

                try:
                    owncloud_client.file_info(fold)
                    print('Fold {} is exist.'.format(fold))
                except Exception as e:
                    print('Fold {} is not exist.. HTTP error is: {}'.format(fold, e))
                    self.creat_fold(owncloud_client, fold)

    def login(self):
        """
        登录网盘
        :return: 返回owncloud链接对象
        """
        try:
            owncloud_client = owncloud.Client(self.url)
            owncloud_client.login(self.username, self.password)
            print('Login success.')
        except Exception as e:
            print('Login failed. HTTP error is: {}'.format(e))

        return owncloud_client

    @staticmethod
    def creat_fold(oc, fold):
        """
        创建文件夹
        :param oc: owncloud_client对象
        :param fold: 被创建的文件夹
        :return: None
        """
        try:
            oc.mkdir(fold)
            print('Creat {} success.'.format(fold))
        except Exception as e:
            print('Creat {} failed. HTTP error is: {}'.format(fold, e))

    @staticmethod
    def upload_file(oc, fold, file):
        """
        上传文件
        :param oc: owncloud_client对象
        :param fold: 目标文件夹
        :param file: 被上传的文件
        :return: None
        """
        try:
            oc.put_file(fold, file)
            print('Upload {} success.'.format(file))
        except Exception as e:
            print('Upload {} failed. HTTP error is: {}'.format(file, e))

    @staticmethod
    def current_date():
        """
        获取当前日期
        :return: list格式的日期
        """
        today = datetime.date.today()
        today_list = str(today).split('-')
        return today_list

    @staticmethod
    def create_assist_date(datestart=None, dateend=None):
        # 创建日期辅助表
        if datestart is None:
            datestart = '2016-01-01'

        if dateend is None:
            dateend = datetime.datetime.now().strftime('%Y-%m-%d')

        # 转为日期格式
        datestart = datetime.datetime.strptime(datestart, '%Y-%m-%d')
        dateend = datetime.datetime.strptime(dateend, '%Y-%m-%d')
        date_list = []
        date_list.append(datestart.strftime('%Y-%m-%d'))
        while datestart < dateend:
            # 日期叠加一天
            datestart += datetime.timedelta(days=+1)
            # 日期转字符串存入列表
            date_list.append(datestart.strftime('%Y-%m-%d'))

        print(date_list)

        return date_list

if __name__ == '__main__':
    
    o = OwncloudUpload()
    o.upload()

3.2、上传多个文件(大文件拆分为小文件—推荐)

owncloud有个不好的地方,那就是用脚本上传不支持断点,如果是上传大文件,还是建议拆分了上传,以下是遍历目标文件下的所有文件,并逐一上传

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import datetime
import owncloud
import os


class OwncloudUpload:
    """
    上传文件到owncloud网盘脚本
    """

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 网址
        self.url = 'https://www.icdlight.cn/owncloud'
        # 用户名
        self.username = 'your_username'
        # 密码
        self.password = 'your_password'
        # 上传文件父文件夹
        self.dic = 'lw'
        # 被上传的文件
        self.file_list = os.listdir('./data')
        #self.file = r'./data/33978196618_e30a59e0a8_o.png'
        self.file = [] 

    def upload(self):

        owncloud_client = self.login()

        today_list = self.current_date()

        # 判断文件夹是否存在
        fold = self.dic
        for i in range(3):
            fold += '/' + today_list[i]

            try:
                owncloud_client.file_info(fold)
                print('Fold {} is exist.'.format(fold))
            except Exception as e:
                print('Fold {} is not exist.. HTTP error is: {}'.format(fold, e))
                self.creat_fold(owncloud_client, fold)

        # 在结尾添加'/',表示当前为文件夹
        fold += '/'
        # 上传文件
        print('Upload fold is {}.'.format(fold))
		#遍历目标文件夹,将一个个文件上传
        for file in self.file_list:
            file_ = './data/' + file
            self.upload_file(owncloud_client, fold, file_)
            print(file)

    def creat_fold_owncloud(self, datestart="2019-07-18", dateend="2019-10-31"):

        owncloud_client = self.login()

        date_list = self.create_assist_date(datestart=datestart, dateend=dateend)
        for n in date_list:
            today_list = n.split('-')

            fold = self.dic
            for i in range(3):
                fold += '/' + today_list[i]

                try:
                    owncloud_client.file_info(fold)
                    print('Fold {} is exist.'.format(fold))
                except Exception as e:
                    print('Fold {} is not exist.. HTTP error is: {}'.format(fold, e))
                    self.creat_fold(owncloud_client, fold)

    def login(self):
        """
        登录网盘
        :return: 返回owncloud链接对象
        """
        try:
            owncloud_client = owncloud.Client(self.url)
            owncloud_client.login(self.username, self.password)
            print('Login success.')
        except Exception as e:
            print('Login failed. HTTP error is: {}'.format(e))

        return owncloud_client

    @staticmethod
    def creat_fold(oc, fold):
        """
        创建文件夹
        :param oc: owncloud_client对象
        :param fold: 被创建的文件夹
        :return: None
        """
        try:
            oc.mkdir(fold)
            print('Creat {} success.'.format(fold))
        except Exception as e:
            print('Creat {} failed. HTTP error is: {}'.format(fold, e))

    @staticmethod
    def upload_file(oc, fold, file):
        """
        上传文件
        :param oc: owncloud_client对象
        :param fold: 目标文件夹
        :param file: 被上传的文件
        :return: None
        """
        try:
            oc.put_file(fold, file)
            print('Upload {} success.'.format(file))
        except Exception as e:
            print('Upload {} failed. HTTP error is: {}'.format(file, e))

    @staticmethod
    def current_date():
        """
        获取当前日期
        :return: list格式的日期
        """
        today = datetime.date.today()
        today_list = str(today).split('-')
        return today_list

    @staticmethod
    def create_assist_date(datestart=None, dateend=None):
        # 创建日期辅助表
        if datestart is None:
            datestart = '2016-01-01'

        if dateend is None:
            dateend = datetime.datetime.now().strftime('%Y-%m-%d')

        # 转为日期格式
        datestart = datetime.datetime.strptime(datestart, '%Y-%m-%d')
        dateend = datetime.datetime.strptime(dateend, '%Y-%m-%d')
        date_list = []
        date_list.append(datestart.strftime('%Y-%m-%d'))
        while datestart < dateend:
            # 日期叠加一天
            datestart += datetime.timedelta(days=+1)
            # 日期转字符串存入列表
            date_list.append(datestart.strftime('%Y-%m-%d'))

        print(date_list)

        return date_list

if __name__ == '__main__':
    
    o = OwncloudUpload()
    o.upload()

上传过程中终端显示:

在这里插入图片描述

代码参考:https://zhuanlan.zhihu.com/p/73970115

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

python批量下载文件并压缩后上传到owncloud 的相关文章

随机推荐

  • 了解搜索引擎技术

    百度 Google搜索引擎核心技术是怎么实现的 搜索引擎 搜索引擎 search engine 是指根据一定的策略 运用特定的计算机程序搜集互联网上的信息 在对信息进行组织和处理后 并将处理后的信息显示给用户 是为用户提供检索服务的系统 全
  • 源于老师的博客

    Javascript学习 老师的博客 JavaScript概述 ECMAScript和JavaScript的关系 1996年11月 JavaScript的创造者 Netscape公司 决定将JavaScript提交给国际标准化组织ECMA
  • VSCODE(十)C++语言特有设置

    C C 插件为C C 开发者提供了丰富的设置项 包括三个方面的设置 env 用户自定义的变量 可以通过类似
  • 人工神经网络建模过程,人工神经网络建模例子

    利用人工神经网络建立模型的步骤 人工神经网络有很多种 我只会最常用的BP神经网络 不同的网络有不同的结构和不同的学习算法 简单点说 人工神经网络就是一个函数 只是这个函数有别于一般的函数 它比普通的函数多了一个学习的过程 在学习的过程中 它
  • k8s优雅停服

    在应用程序的整个生命周期中 正在运行的 pod 会由于多种原因而终止 在某些情况下 Kubernetes 会因用户输入 例如更新或删除 Deployment 时 而终止 pod 在其他情况下 Kubernetes 需要释放给定节点上的资源时
  • freeswitch录音功能开启无法通话

    freeswitch录音问题 之前开启过代理模式 在dialPlan default xml中添加
  • 初学Android,图形图像之打砖块游戏(二十八)

    这个弹球游戏是没有砖块的打砖块游戏 简版 效果如下 package WangLi Graphics PinBall import java util Random import java util Timer import java uti
  • 操作系统实验七-内存页面置换算法的设计和主存储器空间的分配和回收

    个人博客地址 实验1 内存页面置换算法的设计 一 实验内容 实现最近最久未使用 LRU 置换算法 二 实验目的 LINUX中 为了提高内存利用率 提供了内外存进程对换机制 内存空间的分配和回收均以页为单位进行 一个进程只需将其一部分调入内存
  • 云管平台 — vRealize Suite

    原文地址 https blogs vmware com china 2017 11 08 E4 BA 91 E7 AE A1 E5 B9 B3 E5 8F B0 vrealize suite vRealize Suite 是 vRealiz
  • 取余运算的意义

    取余运算的意义一般是给一个数一个界定范围 就比如m n 100 就限定了m的的范围只能是0 100 更形象来说 我们可以把它想象成一个圆环 我们扩大n 就像当于在0 100这个圈内打转 我们再稍微扩展一下 n 0 while true n
  • C/C++ C++20 格式化库 std::format

    说明 文本格式化库提供 printf 函数族的安全且可扩展的替用品 有意使之补充既存的 C I O 流库并复用其基础设施 例如对用户定义类型重载的流插入运算符 头文件 include
  • npm ERR! missing script dev

    刚刚npm install之后执行npm run dev 出现的报错信息npm ERR missing script dev 1 一种可能时vue init webpack的时候多建了一层文件夹 然后运行的时候没有找到package jso
  • MySQL--udf提权

    udf提权 udf user defined function 即 用户自定义函数 是通过添加新函数 对MYSQL的功能进行扩充 如何获得udf文件 将文件放到哪才能让mysql承认这个函数 函数功能 为什么这东西能提权 自定义函数指令是直
  • Netty-UDP协议

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 实现一个UDP应用关键的点 1 和tcp的不同 udp没有接收的说法 所以即使是接收端 也使用Bootstrap 2 指定channel为NioDatagramChanne
  • 汉字编码输入法综述

    2 汉字编码输入法综述 作者 戴石麟 sbxlm 126 com 本章打算分基础工作 理论研究和实用系统三个方面来对汉字编码输入技术的历史和现状进行综合评述 最后指出现有技术中存在的问题并预测今后技术的发展趋势 2 1基础工作 1974年8
  • java 导入自定义类

    eclipse导入很容易 昨天上课学了一下用记事本写java 导入自定义类 这就麻烦了 代码贴一下 方便操作 package tom jiafei public class SquareEquation double a b c doubl
  • 【SpringMVC】Jrebel 插件实现热部署与文件上传

    目录 一 JRebel 1 1 Jrebel介绍 1 2 Jrebel插件下载 1 3 Jrebel服务下载并启动 1 4 在线生成GUID 1 5 JRebel激活 1 6 相关设置 注意 二 文件上传 下载 2 1 导入pom依赖 2
  • MATLAB 拟合神经网络—— fitnet

    建立神经网络 语法 net fitnet hiddenSizes trainFcn hiddenSize 为隐藏层数 是一个行向量 分别表示从左到右的隐藏层神经元数 trainFcn 为训练函数 如下表所示 名称 函数 trainlm Le
  • go 进阶 go-zero相关: 三. go-zero 微服务基础示例

    目录 一 go zero 微服务基础 安装 ETCD 1 docker 安装运行etcd 2 windows 安装 etcd 二 go zero使用goctl命令创建一个普通的服务 三 go zero使用goctl命令创建一个rpc服务 1
  • python批量下载文件并压缩后上传到owncloud

    目录 1 首先获的一个保存url的文件 2 下载文件到服务器 3 将文件上传到owncloud 3 1 上传单个文件 3 2 上传多个文件 大文件拆分为小文件 推荐 摘要 笔者想下载东西到本地 直接下载速度超慢 一共需要下载1500张图 下