Python札记 -- 文件压缩

摘要:
在日常工作中,压缩文件是不可避免的。Python标准库还提供了实现压缩函数/usr/bin/envpython2#编码的模块:utf-834importzipfile56file='/home/jacky/tmp/zip_test/test.apk'78f=zipfile.ZipFile9f.write10f。Close()首先使用ZipFile打开压缩文件,然后通过write方法传入要压缩的文件,最后关闭/usr/bin/envpython2#coding:utf-834importzipfile5importglob67files=glob.glob8f=ZipFile.ZipFile910forfileinfiles:11f.write12f。close()的效果如下:生成的压缩包可以更加完美,比如保留源文件的名称,修改压缩包中的目录结构。ZipFile模块中有许多实用功能,由于空间限制,将不会一一描述。您可以参考官方Python文档。

在日常工作当中免不了要对文件进行压缩,Python标准库里也提供了实现压缩功能的模块。

一、简单的例子

首先了解一下压缩单个文件在Python中怎么实现。竹风建了个测试文件夹zip_text,里面有test.apk和zip_model_test.py两个文件。如下图所示:
Python札记 -- 文件压缩第1张

目标是将test.apk打包成test.zip。编写如下代码:

1 #!/usr/bin/env python
2 #coding:utf-8
3  
4 importzipfile
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即可。跟普通文件的读写操作是一致的。执行后的效果如下:

Python札记 -- 文件压缩第2张

二、重写压缩包里的目录结构

压缩单个文件的功能已经实现了,美中不足的是,压缩包里面的目录结构跟传进去的参数结构是一样的。
可以通过在write方法传递arcname参数来设置路径(wirte的函数原型为ZipFile.write(filename[, arcname[, compress_type]]))。修改代码如下:

1 #!/usr/bin/env python
2 #coding:utf-8
3 
4 importzipfile
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()

三、压缩目录

但是更多的情况是要压缩一个文件夹。直接将文件夹作为参数传入,会有什么样的效果呢?

1 #!/usr/bin/env python
2 #coding:utf-8
3 
4 importzipfile
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()

执行代码后,的确生成了一个压缩文件,可惜解压这个文件的时候,却发现里面只有文件夹的结构,一个文件都没有。。。
Python札记 -- 文件压缩第3张

想达到压缩文件夹的效果,得借助一下glob模块了。借助glob.glob(pathname)来获得一个由指定文件夹下的文件名组成的列表,然后对此进行遍历,代码如下:

1 #!/usr/bin/env python
2 #coding:utf-8
3 
4 importzipfile
5 importglob
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 infiles:
11 f.write(file)
12 f.close()

效果如下:
Python札记 -- 文件压缩第4张

生成的压缩包还可以更完美些,比如保留源文件的名字,修改一下压缩包里面的目录结构。借组os模块的os.path.basename(path),可以取得文件名,修改后代码如下:

1 #!/usr/bin/env python
2 #coding:utf-8
3 
4 importzipfile
5 importglob
6 importos
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 infiles:
12     f.write(file, '/MyDirPath/' +os.path.basename(file))
13 f.close()

这样就可以根据实际需要生成压缩包里面的目录结构了。

四、其他功能

既然可以压缩,当然Python也提供了解压的方法。ZipFile.extractall([path[, members[, pwd]]]),path为解压路径,members为需要解压的文件,另外如果压缩文件有密码时,需要输入pwd。
ZipFile模块内还有很多实用的功能,限于篇幅所限,就不一一叙述了,大家可查阅Python的官方文档。

免责声明:文章转载自《Python札记 -- 文件压缩》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DataTable数据检索的性能分析(转寒江独钓)Android 自定义View使用示例(三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python之判断和循环

计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,可以用if语句实现: age = 20 if age >= 18: print ('your age is,'+str(age)) print ('adult') print ('END') 注意: Pytho...

python测试开发django(33)--xadmin注册表信息

前言 xadmin后台如果要对表的内容增删改查,跟之前的admin.py文件里面写注册表信息一样,需在admin.py同一级目录新建一个adminx.py的文件。 然后在admin.py文件控制页面上需显示的内容。 models模块 models模块跟之前设计表是一样的,在models.py文件设计表的字段显示,以Studentts表为例。 # codin...

Python自动化学习笔记(二)——Jmeter连接数据库、添加压力机、Charles抓包、Python初识

1.Jmeter连接Mysql数据库 1.1添加jar包 选中测试计划,添加jar包 也可以直接将jar包复制到jmeter的lib目录 1.2添加mysql连接信息 测试计划-配置元件-JDBC Connection Configuration,添加Mysql连接信息 Database URL:jdbc:mysql://ip:port/dbname?u...

像Excel一样使用python进行数据分析(3)

像Excel一样使用python进行数据分析(1) 像Excel一样使用python进行数据分析(2) 7,数据汇总 第七部分是对数据进行分类汇总,Excel中使用分类汇总和数据透视可以按特定维度对数据进行汇总,python中使用的主要函数是groupby和pivot_table。下面分别介绍这两个函数的使用方法。 分类汇总 Excel的数据目录下提供了“...

python 判断当前时间是否在一个时间范围内

一、概述 最近在数据分析,需要判断当前时间是否为上班时间:9:00~18:00 二、代码实现 import datetime # 范围时间 d_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + '9:00', '%Y-%m-%d%H:%M') d_time1...

Python代码编写规范,你真的会吗?

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:yangjiajia123456  最近两年的工作都是和运维相关,有时运维人员也会写一些python程序,但基本上都没有遵循相应的代码规范,一向粗暴,能用就行,既不考虑可读性也不考虑可维护性,作为一个开发人员有时候看他们写代码就...