背景:最近学习Python,看到《简明Python教程》,第10章编写一个Python脚本
问题:为所有重要文件备份。
分析:1、需要备份的文件和目录由一个列表指定;2、备份应该保存在主备份目录中;3、文件备份成一个zip文件;4、zip存档的名称为当前的日期和时间;5、使用标准的zip命令。
代码:
# Filename: backup_ver1.py
import os
import zipfile
import time
source = (r'F:\pythonCode\lesson2')
target_path = 'F:\\pythonCode\\lesson\\'
today = target_path + time.strftime('%Y%m%d')
now = time.strftime('%H%M%S')
# print now
if not os.path.exists(today):
os.mkdir(today)
print 'Sucessfully created directory',today
zipName = today + os.sep + now + '.zip'
# print zipName
f = zipfile.ZipFile( zipName, 'w', zipfile.ZIP_DEFLATED )
for dirpath, dirnames, filenames in os.walk(source):
for filename in filenames:
print filename
f.write(os.path.join( source, filename))
# print 1
f.close
代码分析:
本程序中需要引用os、zipfile、time模块,其中zipfile用来创建和读取zip文件,time用来获取当前的时间。
1、zipfile使用用例
z = zipfile.ZipFile(filename, 'r',ZIP_DEFLATED)#这里第二个参数用r表示读取zip文件,w表示创建一个zip文件
for f in z.namelist():
print f
解:此代码用于读取一个zip压缩包里所有文件的名字,filename为文件路径
2、os.walk解读
os.walk(top, topdown = True, onerror = None, followlinks = False)
其中
top:所要遍历的目录地址;
topdown:为真,优先遍历top目录;为假,优先遍历子目录;
os.walk()返回值是一个生成器(generator),返回一个三元组(root,dirs,files),每次循环都更新;
其中
root:指当前遍历的这个文件夹的本身地址;
dirs:是一个list,内容为该文件夹下的所有目录(子目录),也是文件夹;
files:一个list,内容是该文件夹下的所有文件。
下面借用一个例子说明,转自http://www.jianshu.com/p/bbad16822eab
文件结构如下:
a -> b -> 1.txt, 2.txt
c -> 3.txt
d ->
4.txt
5.txt
for (root, dirs, files) in os.walk('a'):
#第一次运行时,当前遍历目录为 a
所以 root == 'a'
dirs == [ 'b', 'c', 'd']
files == [ '4.txt', '5.txt']
。。。
# 接着遍历 dirs 中的每一个目录
b: root = 'a\\b'
dirs = []
files = [ '1.txt', '2.txt']
# dirs为空,返回
# 遍历c
c: root = 'a\\c'
dirs = []
files = [ '3.txt' ]
PS : 如果想获取文件的全路径,只需要
for f in files:
path = os.path.join(root,f)
# 遍历d
d: root = 'a\\b'
dirs = []
files = []
遍历完毕,退出循环
至此可以解读上面Python程序