在平常工做当中免不了要对文件进行压缩,Python标准库里也提供了实现压缩功能的模块。python
1、简单的例子 函数
首先了解一下压缩单个文件在Python中怎么实现。竹风建了个测试文件夹zip_text,里面有test.apk和zip_model_test.py两个文件。以下图所示: 测试
目标是将test.apk打包成test.zip。编写以下代码:spa
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import zipfile 5 6 file = '/home/jacky/tmp/zip_test/test.apk' 7 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) 9 f.write(file) 10 f.close()
首先使用ZipFile打开一个压缩文件,而后将须要压缩的文件经过write方法传入,最后close便可。跟普通文件的读写操做是一致的。执行后的效果以下:code
2、重写压缩包里的目录结构 blog
压缩单个文件的功能已经实现了,美中不足的是,压缩包里面的目录结构跟传进去的参数结构是同样的。
能够经过在write方法传递arcname参数来设置路径(wirte的函数原型为ZipFile.write(filename[, arcname[, compress_type]]))。修改代码以下:ip
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import zipfile 5 6 file = '/home/jacky/tmp/zip_test/test.apk' 7 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) 9 f.write(file, '/res/new_file_name.apk') 10 f.close()
3、压缩目录 utf-8
可是更多的状况是要压缩一个文件夹。直接将文件夹做为参数传入,会有什么样的效果呢?文档
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import zipfile 5 6 file = '/home/jacky/tmp/zip_test/' 7 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) 9 f.write(file) 10 f.close()
执行代码后,的确生成了一个压缩文件,惋惜解压这个文件的时候,却发现里面只有文件夹的结构,一个文件都没有。。。原型
想达到压缩文件夹的效果,得借助一下glob模块了。借助glob.glob(pathname)来得到一个由指定文件夹下的文件名组成的列表,而后对此进行遍历,代码以下:
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import zipfile 5 import glob 6 7 files = glob.glob('/home/jacky/tmp/zip_test/zip_dir_test/*') 8 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) 9 10 for file in files: 11 f.write(file) 12 f.close()
效果以下:
生成的压缩包还能够更完美些,好比保留源文件的名字,修改一下压缩包里面的目录结构。借组os模块的os.path.basename(path),能够取得文件名,修改后代码以下:
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import zipfile 5 import glob 6 import os 7 8 files = glob.glob('/home/jacky/tmp/zip_test/zip_dir_test/*') 9 f = zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) 10 11 for file in files: 12 f.write(file, '/MyDirPath/' + os.path.basename(file)) 13 f.close()
这样就能够根据实际须要生成压缩包里面的目录结构了。
4、其余功能
既然能够压缩,固然Python也提供了解压的方法。ZipFile.extractall([path[, members[, pwd]]]),path为解压路径,members为须要解压的文件,另外若是压缩文件有密码时,须要输入pwd。 ZipFile模块内还有不少实用的功能,限于篇幅所限,就不一一叙述了,你们可查阅Python的官方文档。