python 简单备份文件脚本v2.0

时间:2021-04-05 15:40:24

1.0中使用os.system来压缩会依赖计算机之外的程序,使用zipfile内置模块来创建压缩文档会是一个很好的改进,此外使用日期时间来命名压缩文件不是很全面,希望可以增加用户输入文件名以及增强文件归档功能。

zipfile模块

ZipFile.write(filename[, arcname[, compress_type]])

将指定文件添加到zip文档中。filename为文件路径,arcname为添加到zip文档之后保存的名称, 参数compress_type表示压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。

>>> import zipfile
>>> z=zipfile.ZipFile(r'D:\backup\te.zip','w')
>>> z.write(r'D:QQPCMgr')
>>> z.close()

将整个文件夹进行压缩

先来学习一下os.walk

  迭代这个目录下的所有文件

概述

os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下。

语法

walk()方法语法格式如下:

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

参数

  • top -- 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, 文件夹名字, 文件名】。

  • topdown --可选,为True或者没有指定, 一个目录的的3-元组将比它的任何子文件夹的3-元组先产生 (目录自上而下)。如果topdown为 False, 一个目录的3-元组将比它的任何子文件夹的3-元组后产生 (目录自下而上)。

  • onerror -- 可选,是一个函数; 它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。

  • followlinks -- 设置为 true,则通过软链接访问目录。

返回值

该方法没有返回值。

 

python 简单备份文件脚本v2.0

  a文件夹中:

  python 简单备份文件脚本v2.0

#建立了上图的文件目录,查看os.walk的运行效果

#  文件夹路径, 文件夹名字, 文件名

>>> for root,dirs,files in os.walk('D:/test'):
print (root,dirs,files)


D:/test ['a', 'b'] ['1.txt', '2.txt']D:/test\a ['aa'] ['1.txt']
D:
/test\a\aa [] []
D:
/test\b [] []

第三项,也就是文件名,有利于我们进行压缩所有文件操作

>>> z=zipfile.ZipFile('D:/tt.zip','w')
>>> for root,dirs,files in os.walk('D:/test'): #获取所有文件名
  
for file in files:
   z.write(os.path.join(root,file)) #os.path.join形成完整的文件路径名? 不是很明白 2017-11-05
>>> z.close()

本来担心可能会把所有的文件都放到zip文件中而不会建立相应的文件夹,结果反应建立了a文件夹,但没有建立b文件夹,因为b是一个空文件夹(使用这种方式不会有空文件夹,该怎么使他具有呢,以后学习多了来解决一下2017-11-05)

使用zipfile模块来编写Python代码

#Filename:backup.py
import os,time,zipfile

#要备份的文件的列表
source = ['C:\\Users\\hm\\Desktop\\Web\\CH2','C:\\Users\\hm\\Desktop\\Web\\CH3']
#构造好备份目标文件
target_dir = 'D:\\backup'
target
= target_dir + os.sep + time.strftime('%Y%m%d%H%M%S')+'.zip'
#使用zipfile来压缩
#
创建压缩包变量z
z=zipfile.ZipFile(target,'w')

#遍历所有的文件
for back_dir in source:
for root,filedirs,files in os.walk(back_dir):
for file in files:
z.write(os.path.join(root,file))
z.close()
print('成功备份至',target)

备份成功!

另外的改进

以日期作为文件夹,时间来作为默认的文件名,允许用户自己输入备注名

1.如果不存在今天的日期文件夹,那创建一个

2.用户自己输入了名字,使用该名字命名(将空格替换为_以防止出现处理中的问题)

#Filename:backup.py
import os,time,zipfile

#要备份的文件的列表
source = ['C:\\Users\\hm\\Desktop\\Web\\CH2','C:\\Users\\hm\\Desktop\\Web\\CH3']
#构造好备份目标文件
target_dir = 'D:\\backup'
#创建日期文件夹
today = target_dir + os.sep + time.strftime('%Y%m%d')
if not os.path.exists(today):
os.mkdir(today)

#创建文件名
comment = input("请输入注释:")
if len(comment) == 0:
target
= today + os.sep + time.strftime('%H%M%S')+'.zip'
else:
target
= today + os.sep + time.strftime('%H%M%S') + comment.replace(' ','_') + '.zip'
#使用zipfile来压缩
#
创建压缩包变量z
z=zipfile.ZipFile(target,'w')

#遍历所有的文件
for back_dir in source:
for root,filedirs,files in os.walk(back_dir):
for file in files:
z.write(os.path.join(root,file))
z.close()
print('成功备份至',target)