Python压缩解压–zipfile |
您所在的位置:网站首页 › pythonzipfile压缩图片 › Python压缩解压–zipfile |
原文链接:http://www.juzicode.com/python-tutorial-zip-unzip-zipfile 本文介绍zipfile模块的使用,zipfile可以用来解压或压缩zip格式的文档。 1、判断是否为zip格式的文件使用is_zipfile(文件路径)返回True表示为zipfile模块支持的zip文件,否则为不支持的文件。下面这个例子分别判断zip格式和用7zip压缩生成的7z格式的2个文件是否为zip文件: import zipfile print('files.7z is_zipfile():',zipfile.is_zipfile('files.7z')) print('files.zip is_zipfile():',zipfile.is_zipfile('files.zip'))运行结果: files.7z is_zipfile(): False files.zip is_zipfile(): True如果不确定一个文件是否能用zipfile模块操作,可以在使用前用 is_zipfile() 检查是否为zip格式的文件。 2、获取zip文件信息、解压文件 2.1、创建ZipFile实例首先用ZipFile()创建一个文件实例zf,传入文件名,mode入参默认为读模式:mode=’r’,可以不写。 import zipfile zf = zipfile.ZipFile('files.zip') print(type(zf))运行结果: 2.2、查看zip文件信息通过namelist()方法可以查看文件清单,infolist()方法则返回内部文件的信息列表,可以查看文件大小、CRC、文件名称等,这里压缩文档files.zip的结构如下图: 运行结果: ['files/', 'files/1.txt', 'files/2.txt', 'files/3.bmp'] filename: files/ compress_type: 0 is_dir: True file_size: 0 compress_size: 0 CRC: 0 filename: files/1.txt compress_type: 0 is_dir: False file_size: 20 compress_size: 20 CRC: 2536054424 filename: files/2.txt compress_type: 0 is_dir: False file_size: 12 compress_size: 12 CRC: 3281828313 filename: files/3.bmp compress_type: 8 is_dir: False file_size: 2847150 compress_size: 3461 CRC: 1274188157 2.3、解压文件使用extractall(path=None, members=None, pwd=None)方法解压文件。 如果不带path入参,默认解压到当前工作目录,如果带path参数则解压到path所表示的路径,没有该路径还会创建该路径。 import zipfile zf = zipfile.ZipFile('files.zip') ret=zf.extractall() #解压到当前工作目录 print(ret) ret=zf.extractall(path='E:\\juzicode\\unzip')#解压到指定目录 print(ret)运行结果显示extractall() 总是返回None。 members参数为 infolist() 返回的ZipInfo实例或者文件名称列表,假设知道压缩文档中包含:’files/1.txt’,’files/2.txt’,则可以指定members=[‘files/1.txt’,’files/2.txt’]解压这2个文件,或者使用members=zf.infolist()[:2]解压压缩文档中前2个文件: import zipfile zf = zipfile.ZipFile('files.zip') ret=zf.extractall(path='E:\\juzicode\\unzip1',members=zf.infolist()[:2]) print(ret) ret=zf.extractall(path='E:\\juzicode\\unzip2',members=['files/1.txt','files/2.txt']) print(ret)另外还可以使用extract(member, path=None, pwd=None)解压member表示的单个文件。 其中path变量的功能和ectractall()一样。 member参数可以用压缩文档中的单个文件名member=‘files/1.txt’,或者用单个ZipInfo实例member=zf.infolist()[2],这里注意和extractall()的差异,在extractall()方法里的members参数用的是列表表示多个文件。 #juzicode.com / VX:桔子code import zipfile zf = zipfile.ZipFile('files.zip') ret=zf.extract('files/1.txt',path='unzip1') print(ret) ret=zf.extract(zf.infolist()[3],path='unzip2') print(ret)运行结果: unzip1\files\1.txt #member='files/1.txt' unzip2\files\3.bmp #member=zf.infolist()[3]extract()方法会返回解压缩文档的名称,这点和extractall()有差异。 另外需要注意的是压缩文档可能是来自不同的操作系统,也可能是来自不可信的其他来源,为了安全考虑压缩文档中某些特殊路径在解压缩后会做特殊处理。比如windows系统的盘符以及linux系统的根目录解压后都会去除。另外如果包含..表示的上一层目录也会去掉,而windows下非法的字符会被下划线替代。 这里的例子中原始文件结构如下,在files目录下包含了3个文件: E:\juzicode>tree files /f E:\JUZICODE\FILES 1.txt 2.txt 3.bmp 3.1、write()方法首先用ZipFile()创建一个文件实例zf,传入压缩文件名,mode=’w’表示要创建压缩文档。 然后使用write()传入文件名称,写入压缩文档。 最后用close()关闭压缩文档。 #juzicode.com / VX:桔子code import zipfile zf = zipfile.ZipFile('files2.zip', mode = 'w') zf.write('files/1.txt') #写入压缩文档 zf.write('files/2.txt') zf.close() #如果后面要再次打开files2.zip,这行是必须的可以读出刚才创建压缩文档的文件信息: zf = zipfile.ZipFile('files2.zip', mode = 'r') for info in zf.infolist(): print(info) print('filename:',info.filename) #文件名称 print('compress_type:',info.compress_type)#压缩类型 print('is_dir:',info.is_dir()) #是否为路径 print('file_size:',info.file_size) #文件原始大小 print('compress_size:',info.compress_size) #文件压缩后大小 print('CRC:',info.CRC) #crc zf.close()运行结果: filename: files/1.txt compress_type: 0 is_dir: False file_size: 20 compress_size: 20 CRC: 2536054424 filename: files/2.txt compress_type: 0 is_dir: False file_size: 12 compress_size: 12 CRC: 3281828313另外write()方法压缩文件时,还支持使用arcname修改压缩文档中的名称,比如下面这个例子中将未压缩文件files/1.txt经过压缩后在压缩文档中变成了files1/1ac.txt。 import zipfile zf = zipfile.ZipFile('files2.zip', mode = 'w') zf.write('files/1.txt',arcname='files/1ac.txt') zf.write('files/2.txt') zf.write('files/3.bmp') zf.close()运行后看到的压缩文件结构: ![]() 当使用arcname修改文档名称时,如果包含了盘符或者根目录,出于安全考虑将会去掉盘符或根目录: #juzicode.com / VX:桔子code import zipfile zf = zipfile.ZipFile('files2.zip', mode = 'w') zf.write('files/1.txt',arcname='e:/juzicode/1ac.txt') zf.write('files/2.txt',arcname='/juzicode/2ef.txt') zf.write('files/3.bmp') zf.close()运行后看到的压缩文件结构: ![]() 从这个例子可以看到盘符e:/和根目录/在压缩文档中都消失了。 但是如果使用了上层目录字符:“..” ,或者使用”* ?”等操作系统不识别的字符,压缩文档中仍然按照原样方式照常写入,只是在解压缩的时候会按照前面extract()或者extractall()方法中提到的规则去除或替代。 #juzicode.com / VX:桔子code import zipfile zf = zipfile.ZipFile('files3.zip', mode = 'w') zf.write('files/1.txt',arcname='../juzicode/1ac.txt') zf.write('files/2.txt',arcname='2ef*.txt') zf.write('files/3.bmp',arcname='3?xy.bmp') zf.close()运行后看到的压缩文件结构: writestr()方法和write()方法的流程大致相同: 首先用ZipFile()创建一个文件实例zf,传入压缩文件名,mode=’w’表示要创建压缩文档。 然后用writestr()写文件,第一个入参为文件名称或者ZipInfo实例,第2个入参data为字符串或者二进制数值。 最后用close()关闭压缩文档。 #juzicode.com / VX:桔子code import zipfile pf = open('files/3.bmp','rb') zf = zipfile.ZipFile('files1.zip', mode = 'w') zf.writestr('files/123.txt','123567') #字符串 zf.writestr('files/123.bmp',pf.read()) #bytes pf.close() zf.close()运行后生成的压缩文件结构: ![]() 这个例子中生成了2个文件,一个为txt文本文件,写入的内容为字符串,一个为bmp图片文件,写入的是bytes类型的数据。 扩展阅读: Python桔子教程 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |