【Python】自动备份脚本

news2025/1/22 22:59:06

文章目录

  • 一、前言
  • 二、代码

一、前言

之前因为疫情常常不知道会不会被封在家里,又不想把电脑带过来带过去,就做了这个自动备份的脚本。

功能如下:

  1. 自动从指定根目录里将找到的所有指定后缀名的文件备份到一个备份文件夹里;
  2. 将备份文件夹中的文件自动和阿里云盘同步;
  3. 原文件目录结构不会改变;
  4. 可以屏蔽根目录下一级中不想要的文件夹/文件,下多级的不行;
  5. 定时运行;

二、代码

创建了一个AutoTransfer类,这个类在初始化的时候会自动读取配置文件里的参数,如果没有配置文件也可以后续调用函数时来传参。

调用类里的move_scripts函数可以将指定后缀名的文件备份到备份文件夹里。

调用ali_login函数登录阿里云。

调用find_id函数可以根据阿里云盘里的文件夹名查找文件夹id,这个id后面要用。

调用sync_folder函数进行同步,file_id就是上面的文件夹id,flag表示同步方式,True代表以本地为主。

import os
import json
from tqdm import tqdm
from shutil import copy
from aligo import Aligo


class AutoTransfer:
    def __init__(self, config_file='transfer_config.json'):
        self.config_file = config_file
        # 自动从配置json里获取参数
        if os.path.exists(config_file):
            with open(config_file, mode='r', encoding='utf-8') as c:
                cfg = json.load(c)
            for k, v in cfg.items():
                setattr(self, k, v)

    def __setattr__(self, k, v):
        print(f"Current attribute '{k}' is '{v}'")
        self.__dict__[k] = v

    def move_scripts(self, org_root='', new_root='', blocks=[], exts=[]):
        # 更新参数
        if org_root:
            self.org_root = org_root
        if new_root:
            self.new_root = new_root
        if blocks:
            self.blocks = blocks
        if exts:
            self.exts = exts

        # 检查参数有无缺少
        missing_attr = [attr for attr in ['org_root', 'new_root', 'exts'] if attr not in self.__dict__.keys()]
        if missing_attr:
            raise AttributeError

        folders = os.listdir(self.org_root)
        backup_folders = [os.path.join(self.org_root, fd) for fd in folders if fd not in self.blocks]
        for fdr in tqdm(backup_folders):
            cur_files = self.list_dir(fdr)
            for f in cur_files:
                if os.path.splitext(f)[-1] in self.exts:
                    total_path = f.replace(self.org_root, self.new_root)
                    new_folder, f_name = os.path.split(total_path)
                    if not os.path.exists(new_folder):
                        os.makedirs(new_folder)
                    copy(f, total_path)

        self.remember_configs()

    @staticmethod
    def list_dir(cur_path: str):
        """
        列举文件根目录下各文件路径的函数。
        :param cur_path: 根目录。
        :return: 根目录下所有子目录里的所有文件。
        """
        file_paths = []
        for root, dirs, files in os.walk(cur_path):
            for file in files:
                file_paths.append(os.path.join(root, file))
        return file_paths

    def ali_login(self):
        self.aligo = Aligo()

    def find_id(self, target_name):
        for f in self.aligo.get_file_list():
            if f.name == target_name:
                return f.file_id

    def sync_folder(self, file_id='', flag=None):
        if file_id:
            self.file_id = file_id
        if flag:
            self.flag = flag
        self.remember_configs()
        self.aligo.sync_folder(self.new_root, self.file_id, self.flag)

    def remember_configs(self):
        config_dict = {k: v for k, v in self.__dict__.items() if
                       k in ['org_root', 'new_root', 'blocks', 'exts', 'file_id', 'flag']}
        with open(self.config_file, mode='w', encoding='utf-8') as f:
            json.dump(config_dict, f)


if __name__ == '__main__':
    at = AutoTransfer()
    at.move_scripts()
    # print(at.find_id('BF_projects'))
    at.ali_login()
    at.sync_folder()

接下来创建一个.bat文件:

@echo off

D:

cd 脚本路径

start python 脚本文件名.py

exit

最后创建定时任务即可:

在这里插入图片描述

如果想每天看着它运行,记得勾选“只在用户登录时运行”。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ImageAdaptive-YOLO

又发现了一个yolo~~ 恶劣天气下的目标检测 也叫IA-YOLO 源代码:https://github.com/wenyyu/ImageAdaptive-YOLO 尽管基于深度学习的目标检测方法在传统数据集上取得了可喜的结果,但从恶劣天气条件下捕获的低质量图像中定位目标仍然具有挑战性。现有方…

三顾茅庐,七面阿里,25k*16offer,还原我的大厂面经

写在片头:声明,勿杠 首先简单说一下,这三次面试阿里并不是一次性去面的,实际上第一次面试时候还在大四,找的实习岗,不太清楚是什么部门,别问我为什么还记得面试题,有记录和复盘的习…

C++Easyx世界杯版跑酷小游戏

🐑本文作者:克隆窝🐑 🎮🔊本文代码适合编译环境:DEV-C💻 ✨🧨温馨提示:此文乃作者心血,如要转载请标注版权,否则视为抄袭!&#x1f38…

计算机毕设Python+Vue羊肉溯源系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Python图形用户界面(GUI)之PyQt6入门及转换视频格式示例

上篇文章中学习的wxPython用户界面,没有拖拽组件等操作,不是很方便,下面来看个更加强大的GUI>PyQt系列,拥有拖拽组件界面,这样设计界面就显得非常简单与方便了。Qt库由 Riverbank Computing开发,是最强大…

【Linux】版本控制器Git

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉Git概述&a…

Pytorch~单卡改多卡

搬来了这个,这是尝试单卡改多卡加速的过程中出现的bug记录:一是继承DistributedSampler的漏洞百出,二是master进程无法正常结束,这里详细的阐述了出错的细节以及给出了修改的方法。 先说明一下背景,目前正在魔改以下这篇论文的代…

JavaScript 中事件循环(eventloop)、垃圾回收机制、闭包、递归函数的理解及示例

事件循环(eventloop) 概念 js 是单线程,为防止阻塞代码,把同步代码交给 js 引擎执行 异步代码交给宿主环境, 同步代码放入执行栈中 异步代码等待时机送入任务队列中, 执行栈执行完毕 会去任务队列看是否有异步任务 有就送到执行…

Postman核心功能解析-参数化和测试报告

参数化处理 参数化:针对于某一个接口,有大量的的测试数据需要批量验证,一个一个的更改请求参数太耗时耗力,使用参数化批量处理数据会比较高效,常规通过文档参数化实现。 创建文件 格式CSV 文件内第一行信息 需要和参数…

谈谈转行数据分析以及工作的心得

由于两个月前写了一篇文章叫《自己找数据分析师时犯的错误》,然后这期间就一直有人问我找到工作了吗?面试的时候,面试官都是问你的什么呢?你从事数据分析工作之后主要干什么呢?所以想在这里为大家分别解答下。 首先回…

【Linux】编译器gcc / g++的使用

​🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉gcc / g的…

快速玩转ChatGPT全攻略

本文内容: 准备工作。 注册接嘛平台。 注册OpenAI账号。 开始畅聊。 一.准备工作: Proxy,美国,日本,韩国,新加坡,印度,不能用香港。 Chrome浏览器。 二、注册接嘛平台&#x…

在ARM微控制器上部署MATLAB/Simulink仿真模型

在ARM微控制器上部署MATLAB/Simulink仿真模型 苏勇,suyong_yq126.com,2022年12月 文章目录在ARM微控制器上部署MATLAB/Simulink仿真模型IntroductionOverviewMATLAB、Simulink、StateFlow、Real-Time Workshop之间的关系MATLAB Coder、Simulink Coder、…

最新版Android原生集成RN

前言 现在不少应用都是采用了混合开发模式,不论是原生加RN,或是原生加Flutter,或是原生加H5。原生实现主业务线,其他部分可以借助跨平台方案开发,提高开发效率,或者实现热更新,调高业务迭代效率。 下面简单介绍一下A…

如何调整参数来更好地使用频谱分析仪

前言 使用频谱分析仪,最简单最直观的目的就是寻找并观测范围内的频谱信号,乃至将其保存下来做更进一步的数字处理或分析。因此在除了最基本的中心频率与扫宽设置外,合理使用VBW,RBW等参数设置才能获取更为真实准确的信号。 图一 合理调整参数…

Diffusion Model合集 part3

扩散模型原理介绍3八,Diffusion Probabilistic Model的算法代码而我们可以有多种建模目标:Lt−1Eq[12σt2∣∣μt∼(xt,x0)−μθ(xt,t)∣∣2]CL_{t-1}\mathbb{E}_{q}\left[\frac{1}{2\sigma_{t}^{2}}||\overset{\sim}{\mu_{t}}(\mathbf{x}_{t},\mathbf{…

系统调用(Linux)

目录 1.内核态和用户态: 1.1CPU的两种状态: 1.2CPU 指令集权限: 1.3用户态与内核态的空间: 1.4用户态与内核态的切换: 2.系统调用: 2.1linux框架图: 2.2系统调用和API: 2.3系…

The release Method

The release Method The role of the release method is the reverse of open. Sometimes youll find that the method implementation is called device_close instead of device_release. Either way, the device method should perform the following tasks: 释放方法的作用…

跟我学 UML 系统建模

UML 系统建模 1 概述 1.1 课程概述 汇集 UML 及其相关的一些话题回顾 UML 相关的符号与概念以电商订单相关业务为例,借助 UML 完成系统建模将 UML 变成提升建模效率,表达架构思想的工具 1.2 什么是 UML ​ Unified Modeling Language 统一建模语言&a…

Leetcode-1753-移除石子的最大得分

1、堆 我们可以维护一个大顶堆,其中储存了三个石子堆中石子的个数。为了确保我们的分数尽可能大,我们每次都需要从最大的两个堆中取出石子。因此我们不断循环,每次都从当前最大的堆中取出石子。值得注意的是,为了确保能够发现游戏…