当前位置: 首页 > news >正文

Python世界:文件自动化备份实践

Python世界:文件自动化备份实践

    • 背景任务
    • 实现思路
    • 坑点小结

背景任务


问题来自《简明Python教程》中的解决问题一章,提出实现:对指定目录做定期自动化备份。

最重要的改进方向是不使用 os.system 方法来创建归档文件, 而是使用 zipfile 或 tarfile 内置的模块来创建它们的归档文件。 ——《简明Python教程》

本文在其第4版示范代码基础上,尝试采用内部python自带库zipfile的方式,实现功能:进行文件压缩备份。

实现思路


文件命名demo_backup_v5.py,视为改进的第5版实现,除采用自带zipfile的方式,还有以下更新:

  • 支持外部自定义设参
  • 支持自定义压缩文件内目录名称,并去除冗余绝对路径

编码思路:

  1. 指定待备份目录和目标备份路径
  2. 按日期建立文件夹
  3. 按时间建立压缩文件

首先,进行输入前处理,对目录路径进行处理:

    if len(sys.argv) >= 3: # 有外部入参,取外部输入tobe_backup_dir = sys.argv[1] # input dir, sys.argv[0] the name of python filetarget_dir = sys.argv[2] # output dircomment_info = input("enter a comment information => ")else: # 无外部入参,则内部设定# tobe_backup_dir = "C:\\Users\\other"tobe_backup_dir = r"E:\roma_data\code_data_in\inbox"target_dir = "E:\\roma_data\\code_test"comment_info = "test demo"

其次,正式进入程序处理函数:backup_proc(),先判断目标备份目录是否存在,如不存在,先构造1个。

接着,按日期today进行备份文件夹创建,按时间now进行压缩文件命名备份。

最后,遍历待备份源目录所有文件,将其压缩为时间now命名的zip文件中。

# 仅支持单个目录备份
def backup_proc(tobe_backup_dir, target_dir, comment_info):if_not_exist_then_mkdir(target_dir)today = target_dir + os.sep + "backup_" + time.strftime("%Y%m%d") # 年、月、日now = time.strftime("%H%M%S") # 小时、分钟、秒print("Successfully created")# zip命名及目录处理prefix = today + os.sep + nowif len(comment_info) == 0:target = prefix + '.zip'else:target = prefix + "_" + comment_info.replace(" ", "_") + '.zip'if_not_exist_then_mkdir(today)# 参考链接:https://blog.csdn.net/csrh131/article/details/107895772# zipfile打开文件句柄, with打开不用手动关闭with zipfile.ZipFile(target, "w", zipfile.ZIP_DEFLATED) as f:for root_dir, dir_list, file_list in os.walk(tobe_backup_dir): # 能遍历子目录所有文件for name in file_list:target_file = os.path.join(root_dir, name)all_file_direct_zip = Falseif all_file_direct_zip: # 不加内部目录zip_internal_dir_prefix = os.sepelse: # 加内部目录zip_internal_dir_prefix = comment_info + os.sep# 去掉绝对路径指定压缩包里面的文件所在目录结构   arcname = zip_internal_dir_prefix + target_file.replace(tobe_backup_dir, "")# arcname = target_file.replace(tobe_backup_dir, "")f.write(target_file, arcname=arcname)return

测试用例

  • python外部入参
    • python demo_backup_v5.py “E:\roma_data\code_data_in\inbox” “E:\roma_data\code_test”
  • python内部入参
    • python demo_backup_v5.py

本实现的一个缺点是,仅支持单一目录备份,秉持短小精悍原则,如需多目录备份可在以上做加法。

坑点小结


坑点1:不要多级目录,去除绝对路径

解决:zipfile压缩包如何避免绝对路径

坑点2:Unable to find python module

运行if not os.path.exists(path_in)报错。

根因:python有多个版本,3.6运行时不支持,需要>=3.8。

解决:Ctrl + Shift + P,输入Select Interpreter,指定高版本版本解释器。

参考:link1,link2

坑点3:TypeError: stat: path should be string, bytes, os.PathLike or integer, not list

根因:输入的path路径是个list没有拆解开,索引访问元素给string输入。

示例实现:

# -*- coding: utf-8 -*-
"""
Created on 09/03/24
功能:文件备份
1、指定待备份目录和目标备份路径
2、按日期建立文件夹
3、按时间建立压缩文件
"""import os
import time
import sys
import zipfile# 判断该目录是否存在,如不存在,则创建
def if_not_exist_then_mkdir(path_in):if not os.path.exists(path_in):os.mkdir(path_in)print("Successfully created directory", path_in)# 仅支持单个目录备份
def backup_proc(tobe_backup_dir, target_dir, comment_info):if_not_exist_then_mkdir(target_dir)today = target_dir + os.sep + "backup_" + time.strftime("%Y%m%d") # 年、月、日now = time.strftime("%H%M%S") # 小时、分钟、秒print("Successfully created")# zip命名及目录处理prefix = today + os.sep + nowif len(comment_info) == 0:target = prefix + '.zip'else:target = prefix + "_" + comment_info.replace(" ", "_") + '.zip'if_not_exist_then_mkdir(today)# 参考链接:https://blog.csdn.net/csrh131/article/details/107895772# zipfile打开文件句柄, with打开不用手动关闭with zipfile.ZipFile(target, "w", zipfile.ZIP_DEFLATED) as f:for root_dir, dir_list, file_list in os.walk(tobe_backup_dir): # 能遍历子目录所有文件for name in file_list:target_file = os.path.join(root_dir, name)all_file_direct_zip = Falseif all_file_direct_zip: # 不加内部目录zip_internal_dir_prefix = os.sepelse: # 加内部目录zip_internal_dir_prefix = comment_info + os.sep# 去掉绝对路径指定压缩包里面的文件所在目录结构   arcname = zip_internal_dir_prefix + target_file.replace(tobe_backup_dir, "")# arcname = target_file.replace(tobe_backup_dir, "")f.write(target_file, arcname=arcname)returnif __name__ == '__main__':print('start!')# 前处理if len(sys.argv) >= 3: # 有外部入参,取外部输入tobe_backup_dir = sys.argv[1] # input dir, sys.argv[0] the name of python filetarget_dir = sys.argv[2] # output dircomment_info = input("enter a comment information => ")else: # 无外部入参,则内部设定# tobe_backup_dir = "C:\\Users\\other"tobe_backup_dir = r"E:\roma_data\code_data_in\inbox"target_dir = "E:\\roma_data\\code_test"comment_info = "test demo"# 正式运行backup_proc(tobe_backup_dir, target_dir, comment_info)# 正式退出main函数进程,以免main函数空跑print('done!')sys.exit()

相关文章:

Python世界:文件自动化备份实践

Python世界:文件自动化备份实践 背景任务实现思路坑点小结 背景任务 问题来自《简明Python教程》中的解决问题一章,提出实现:对指定目录做定期自动化备份。 最重要的改进方向是不使用 os.system 方法来创建归档文件, 而是使用 zip…...

PTA 6-10 阶乘计算升级版(详讲)

6-10 阶乘计算升级版 - 基础编程题目集 (pintia.cn)https://pintia.cn/problem-sets/14/exam/problems/type/6?problemSetProblemId742&page0 首先这道题不能用我们之前学过的阶乘计算方法来解决,比如下面这段代码就无法通过全部的样例 void Print_Factorial…...

软件开发人员从0到1实现物联网项目:项目架构的思考

文章目录 前言单体应用足矣摒弃传统的微信对接后期的维护投入上真正的“云”:云托管0服务器免运维免费的CDN和DDoS防护 技术架构小结 前言 因为种种原因,《软件开发人员从0到1实现物联网项目》这个项目的进度停滞了将近一个月。 鉴于该项目的前期开发和…...

Java--集合进阶 Collection,迭代器,lambda表达式

集合体系结构 Collection:单列集合 LIst系列集合:添加的元素是有序、可重复、有索引 Set系列集合:添加的元素是无序、不重复、无索引 Collection集合常用方法 | 方法名 | 说明 || :---…...

STM32G474之DAC

STM32G474分别使用CORDIC硬件和“math.h”的正弦值,从DAC1和DAC2输出。 1、DAC特点 PA4的附加功能为DAC1_OUT1,无需映射,直接将它配置为模拟功能,就可以使用了。 PA6的附加功能为DAC2_OUT1,无需映射,直接将…...

哈希表的底层实现(2)---C++版

目录 链地址法Separate Chaining——哈希桶的模拟实现 超大重点分析: 两种方法对比 由于在上次的哈希表的底层实现(1)---C版已经详细的阐述了相关的结构和原理,哈希表的实现方法主要分为链地址法和开放定址法。开放定址法上次已经实现过了&#xff0c…...

算法知识点————【LRU算法】

思想:淘汰最久没有使用的 应用场景:手机清后台的时候先清最久没有使用的应用 设计一种数据结构:接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是…...

记一次MySQL视图查询优化的经验

背景:库房系统项目迁移,两个版本的结构发生了很大变化,新版本的库存系统在开发阶段由于数据量小,根据看不出查询的性能问题,还沾沾自喜的想新版本多好。但是在做同步之后(规则变更,需要插入很多…...

Cloudways搭建WordPress外贸独立站完整教程(1)

验证邮件发送完成后,就等待Cloudways的回复邮件,一般24小时之内就会收到激活的邮件。 Cloudways账号升级 激活成功后还需要账户升级,Cloudways提供了为期3天的免费试用体验。如果在试用期结束之前未绑定信用卡以升级账户,试用期…...

Delphi5数据控制组件——查询

文章目录 效果图参考查询Free方法Close方法总结通俗理解 完整代码 效果图 参考 本文是在上一篇的基础上,将查询页面重新写一次。 查询 {点击查询} procedure TForm2.Button1Click(Sender: TObject); vartj,tj1,tj2,tj3,tj4,tj5,tj6,tj7:string; begin//按照工号查…...

git pull之后发现项目错误,如何回到之前的版本方法

目录 首先我们打开小程序的cmd的黑窗口,git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已经返回了之前的6daaa2e的版本了 首先我们打开小程序的cmd的黑窗口,git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已…...

防跌倒识别摄像机

防跌倒识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备,旨在通过实时监测和分析监控画面中的行为动作,及时发现并预防跌倒事件的发生。这种摄像机在医疗、养老院、家庭等场所有着广泛的应用前景。 防跌倒识别摄像机在医疗领域具有重要意义…...

MyQql性能诊断与实践

获取更多免费资料,见下图...

有序序列判断

描述 输入一个整数序列&#xff0c;判断是否是有序序列&#xff0c;有序&#xff0c;指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据范围&#xff1a;3 < n< 50 序列中的值都满足 1< val < 100 输入描述&#xff1a; 第一行输入一个整数N…...

【Kubernetes知识点问答题】健康检查

目录 1. Kubernetes 对集群 Pod 和容器健康状态如何进行监控和检测的。 2. 解释 LivenessProbes 探针的作用及其适用场景。 3. 解释 ReadinessProbe 探针的作用及其适用场景。 4. 解释 StartupProbe 探针的作用及其适用场景。 5. 说明 K8s 中 Pod 级别的 Graceful Shutdown…...

【Prometheus】PromQL数据类型以及常用的计算函数用法详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

STM32高级定时器生成互补PWM的原理与代码实现

文章目录 前言一 CubeMx配置1.1 TIM1 Mode and Configuration1.2 Paramter Settings 二 程序代码三 仿真分析总结 前言 互补 PWM&#xff08;Complementary PWM&#xff09;是指一对逻辑状态互为反相的 PWM&#xff08;脉冲宽度调制&#xff09;信号。这种信号配置常见于电机控…...

双指针题总结

双指针题总结 hot100移动零盛水最多的容器三数之和接雨水最小覆盖子串 hot100 移动零 题目链接&#xff1a; 283.移动零 代码&#xff1a; class Solution {public void moveZeroes(int[] nums) {int slow 0;for (int fast 0; fast < nums.length; fast ){if (nums[fas…...

[数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8068 标注数量(xml文件个数)&#xff1a;8068 标注数量(txt文件个数)&#xff1a;8068 标注…...

JVM3-双亲委派机制

目录 概述 作用 如何指定加载类的类加载器&#xff1f; 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制&#xff…...

一键永久保存:用novel-downloader打造你的个人数字图书馆 [特殊字符]

一键永久保存&#xff1a;用novel-downloader打造你的个人数字图书馆 &#x1f4da; 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 在信息飞速更迭的互联网时代&#xff0c;你是否曾…...

3分钟免费激活Windows和Office:开源KMS激活脚本终极指南

3分钟免费激活Windows和Office&#xff1a;开源KMS激活脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否正在为电脑屏幕上那个"Windows未激活"的水印而烦恼&#xf…...

UnityExplorer终极调试指南:如何用游戏内UI工具提升开发效率

UnityExplorer终极调试指南&#xff1a;如何用游戏内UI工具提升开发效率 【免费下载链接】UnityExplorer An in-game UI for exploring, debugging and modifying IL2CPP and Mono Unity games. 项目地址: https://gitcode.com/gh_mirrors/un/UnityExplorer UnityExplor…...

yuzu模拟器完整使用指南:在电脑上畅玩Switch游戏的终极教程

yuzu模拟器完整使用指南&#xff1a;在电脑上畅玩Switch游戏的终极教程 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器是目前最受欢迎的开源任天堂Switch模拟器&#xff0c;让你能够在Windows、Linux和…...

GraphScale:解耦计算与存储,攻克十亿级图学习的内存与通信瓶颈

1. 项目概述&#xff1a;为什么我们需要一个全新的图学习框架&#xff1f;如果你在过去几年里尝试过处理一个真正“大”的图——比如用户关系网络、商品关联图或者学术引用网络——你大概率会和我有同样的感受&#xff1a;现有的工具在规模面前&#xff0c;显得力不从心。图神经…...

CSS Flexbox高级技巧:构建灵活的响应式布局

CSS Flexbox高级技巧&#xff1a;构建灵活的响应式布局 引言 Flexbox是CSS3引入的一维布局模型&#xff0c;它提供了强大的灵活布局能力。本文将深入探讨Flexbox的高级技巧和最佳实践&#xff0c;帮助你构建更优雅的响应式布局。 一、Flexbox核心概念回顾 .container {display:…...

小红书视频下载终极指南:5分钟掌握免费无水印批量下载技巧

小红书视频下载终极指南&#xff1a;5分钟掌握免费无水印批量下载技巧 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接…...

JMeter梯度压测:精准定位系统可扩展性边界

1. 为什么“梯度式压测”不是加个线程组就完事了&#xff1f;很多人第一次打开JMeter&#xff0c;照着教程建个线程组、加个HTTP请求、跑个聚合报告&#xff0c;看到TPS从200涨到800就以为“压测完成了”。结果上线后流量一上来&#xff0c;服务直接503&#xff0c;监控里CPU没…...

不确定性量化神经网络:从海平面预测到状态依赖可预测性物理机制挖掘

1. 项目概述&#xff1a;用不确定性量化神经网络“透视”海平面预测的奥秘在气候与海洋研究的前沿&#xff0c;预测未来几天到几个月内的海平面变化&#xff0c;一直是个让人又爱又恨的难题。爱的是&#xff0c;准确的预测能直接服务于沿海城市的防洪预警、港口运营和生态保护&…...

[智能体-26]:ollama, 让模型的部署和提供服务(远程或本地)变得异常简单

极简一键部署&#xff0c;自动封装OpenAI 标准 API&#xff0c;本地 / 远程服务秒启用&#xff0c;无需复杂环境编译、配置端口、适配接口。核心亮点安装零门槛跨 Windows/Mac/Linux&#xff0c;一键安装包&#xff0c;无需 CUDA、Python 环境预处理。模型一键拉取运行bash运行…...