前几天搞数据备份,因为有windows系统和linux系统,为了备份的数据格式统一,就都把要备份的数据自动打包成zip文件了,这样在linux系统上也方便解压,之前用的rar格式,linux默认解压不了,比较麻烦,经过这么一折腾,就方便多了,用python实现目录的压缩,主要是用到了zipfile模块,来创建文件实例,然后写入文件名称,基本思路就是这个,我们来看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/usr/bin/env python #mindg.cn #date:20160203 import os import sys import os.path import zipfile def cr_zip(zfname, fpath): filelist = [] isfp = os.path.basename(fpath) if isfp: print '%s is not path' % fpath sys.exit(0) else: for root,subdirs,files in os.walk(fpath): for file in files: filelist.append(os.path.join(root,file)) zf = zipfile.ZipFile(zfname,'w',zipfile.ZIP_DEFLATED) for f in filelist: zf.write(f) zf.close() if __name__ == '__main__': cr_zip('script_20160203.zip', '/root/script/') |
我们来逐行解释,代码最开始几行是导入的需要的模块,再往下是定义了一个函数,cr_zip()函数接受两个参数,一个是压缩后的文件名称,一个是是要压缩的目录路径,函数头几行是先判断用户提供的是否是个目录,如果不是,程序直接退出,如果是调用os.walk()函数,遍历这个目录,os.walk()函数返回三个元组,分别对应目录的路径,子目录名称,除了目录外的文件名字,如果要将他们拼成完成路径,需要用到os.path.join(dirpath, name)函数,这个函数会将目录和文件拼在一起返回,所以脚本用这个函数来做拼接,将拼接的完整路径加入filelist列表中,
1 |
zf = zipfile.ZipFile(zfname,'w',zipfile.ZIP_DEFLATED) |
这行返回zipfile实例,除了’w’写入模式,还有’r’读,’a’添加一个文件到现有压缩文件中,zipfile.ZIP_DEFLATED是压缩采用的方法,另一个方法是ZIP_STORED,这是默认的,表示不压缩,因为我们需要压缩,所以我们没有用默认的方法,最后是一个循环,遍历filelist列表,把文件加入归档到script_20160203.zip中。