日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 Python教程 正文

Python?自動備份腳本的示例代碼_python

作者:Sprite.Nym ? 更新時間: 2023-01-31 Python教程

一、前言

之前因為疫情常常不知道會不會被封在家里,又不想把電腦帶過來帶過去,就做了這個自動備份的腳本。

功能如下:

  • 自動從指定根目錄里將找到的所有指定后綴名的文件備份到一個備份文件夾里;
  • 將備份文件夾中的文件自動和阿里云盤同步;
  • 原文件目錄結構不會改變;
  • 可以屏蔽根目錄下一級中不想要的文件夾/文件,下多級的不行;
  • 定時運行;

二、代碼

創建了一個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

最后創建定時任務即可:

如果想每天看著它運行,記得勾選“只在用戶登錄時運行”。

原文鏈接:https://blog.csdn.net/SpriteNym/article/details/128394988

欄目分類
最近更新