網站首頁 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
- 上一篇:???????Python?入門學習之函數式編程_pytho
- 下一篇:沒有了
相關推薦
- 2022-07-22 CSS設置元素隱藏的4種方法
- 2022-08-25 Python中的基本數據類型介紹_python
- 2022-03-27 C++浮點數在內存中的存儲詳解_C 語言
- 2023-05-21 linux中grep命令使用實戰詳解_Linux
- 2022-06-25 python數據寫入Excel文件中的實現步驟_python
- 2022-09-15 利用Anaconda創建虛擬環境的全過程_python
- 2022-11-28 pytorch?dataset實戰案例之讀取數據集的代碼_python
- 2022-05-24 C++基于Floyd算法實現校園導航系統_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支