当前位置: 首页 > 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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 聚类算法-Kmeans聚类
  • 基础闯关4
  • CentOS7虚拟机下安装及使用Docker
  • qt5.15.2在线安装选项不见了?怎么办?
  • 【Pythonj进阶】Python中的日志记录与监控:跟踪和分析应用程序行为
  • union 的正确食用方法
  • 文件包含漏洞PHP伪协议利用方法
  • Mac 安装 jdk 8详细教程
  • 有限体积法:基于一维稳态扩散问题及其程序实现
  • 计算机网络 第2章 物理层
  • 农产品自主供销系统小程序的设计
  • 94.游戏的启动与多开-互斥量对开检测
  • 同三维S61-20SDI 20倍 HDMI SDI USB3.0 网口 3高清摄像机
  • Azure AI Search 中的二进制量化:优化存储和加快搜索速度
  • 【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况)
  • Django 博客开发教程 16 - 统计文章阅读量
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • egg(89)--egg之redis的发布和订阅
  • HTTP请求重发
  • If…else
  • java8-模拟hadoop
  • java概述
  • leetcode-27. Remove Element
  • nginx 配置多 域名 + 多 https
  • node和express搭建代理服务器(源码)
  • win10下安装mysql5.7
  • 创建一个Struts2项目maven 方式
  • 推荐一个React的管理后台框架
  • 追踪解析 FutureTask 源码
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #Spring-boot高级
  • ${factoryList }后面有空格不影响
  • $L^p$ 调和函数恒为零
  • $refs 、$nextTic、动态组件、name的使用
  • (~_~)
  • (09)Hive——CTE 公共表达式
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (web自动化测试+python)1
  • (苍穹外卖)day03菜品管理
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (三)elasticsearch 源码之启动流程分析
  • (转)程序员疫苗:代码注入
  • (转)可以带来幸福的一本书
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET Core 成都线下面基会拉开序幕
  • .Net FrameWork总结
  • .NET IoC 容器(三)Autofac
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET运行机制