python zip文件 压缩


Posted in Python onDecember 24, 2008

从简单的角度来看的话,zip格式会是个不错的选择,而且python对zip格式的支持够简单,够好用。
1)简单应用
如果你仅仅是希望用python来做压缩和解压缩,那么就不用去翻文档了,这里提供一个简单的用法,让你一看就能明白。
import zipfile
f = zipfile.ZipFile('filename.zip', 'w' ,zipfile.ZIP_DEFLATED)
f.write('file1.txt')
f.write('file2.doc')
f.write('file3.rar')
f.close()
f.zipfile.ZipFile('filename')
f.extractall()
f.close()
不知道上面的例子是不是足够简单呢?
1.1 zipfile.ZipFile(fileName[, mode[, compression[, allowZip64]]])
fileName是没有什么疑问的了。
mode和一般的文件操作一样,'r'表示打开一个存在的只读ZIP文件;'w'表示清空并打开一个只写的ZIP文件,或创建一个只写的ZIP文件;'a'表示打开一个ZIP文件,并添加内容。
compression表示压缩格式,可选的压缩格式只有2个:ZIP_STORE;ZIP_DEFLATED。ZIP_STORE是默认的,表示不压缩;ZIP_DEFLATED表示压缩,如果你不知道什么是Deflated,那么建议你去补补课。
allowZip64为True时,表示支持64位的压缩,一般而言,在所压缩的文件大于2G时,会用到这个选项;默认情况下,该值为False,因为Unix系统不支持。
1.2 zipfile.close()
说真的,这个没什么可说的,如果有的话,那就是你写入的任何文件在关闭之前不会真正写入磁盘。
1.3 zipfile.write(filename[, arcname[, compress_type]])
acrname是压缩文件中该文件的名字,默认情况下和filename一样
compress_type的存在是因为zip文件允许被压缩的文件可以有不同的压缩类型。
1.4 zipfile.extractall([path[, member[, password]]])
path解压缩目录,没什么可说的
member需要解压缩的文件名儿列表
password当zip文件有密码时需要该选项
对于简单的应用,这么多就够了。
2)高级应用
2.1 zipfile.is_zipfile(filename)
判断一个文件是不是压缩文件
2.2 ZipFile.namelist()
返回文件列表
2.3 ZipFile.open(name[, mode[, password]])
打开压缩文档中的某个文件
2.4 ZipFile.infolist()
2.5 ZipFile.getinfo(name)
上述文件返回ZipInfo对象,只不过一个返回的是列表,一个返回的是一个ZipInfo
ZipInfo类
2.6 ZipInfo.filename
2.7 ZipInfo.date_time
返回值的格式为(year,month,date,hour,minute,second)
2.8 ZipInfo.compress_type
2.9 ZipInfo.comment
2.10ZipInfo.extra
2.11ZipInfo.create_system
2.12ZipInfo.extract_version
2.13ZipInfo.reserved 总是0
2.14ZipInfo.flag_bits
2.15ZipInfo.volume
2.16ZipInfo.internal_attr
2.17ZipInfo.external_attr
2.18ZipInfo.header_offset
2.19ZipInfo.CRC
2.20ZipInfo.file_size
2.21ZipInfo.compress_size
2.22ZipFile.testzip()
检查每个文件和它对应的CRC,如果有错误返回对应的文件列表
2.23ZipFile.setpassword(password)
2.24ZipFile.read(name[,password])
返回对应的文件
2.25ZipFile.printdir()
打印压缩文件夹的信息
2.26ZipFile.writestr(zipinfo_or_arcname, bytes)
PyZipFile类
zipfile.PyZipFile除了上面的方法和属性之外,还有一个特殊的方法
2.27PyZipFile.writepy(pathname,basename)
一般情况下,仅仅压缩.pyc和.pyo文件,不压缩.py文件
----------------------------------------------------------------------
zip文件格式信息
一个 ZIP 文件由三个部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志
1)压缩源文件数据区
在这个数据区中每一个压缩的源文件/目录都是一条记录,记录的格式如下: [文件头+ 文件数据 + 数据描述符]

a、文件头结构

组成 长度

文件头标记 4 bytes (0x04034b50)

解压文件所需 pkware 版本 2 bytes

全局方式位标记 2 bytes

压缩方式 2 bytes

最后修改文件时间 2 bytes

最后修改文件日期 2 bytes

CRC-32校验 4 bytes

压缩后尺寸 4 bytes

未压缩尺寸 4 bytes

文件名长度 2 bytes

扩展记录长度 2 bytes

文件名 (不定长度)

扩展字段 (不定长度)


b、文件数据


c、数据描述符

组成 长度

CRC-32校验 4 bytes

压缩后尺寸 4 bytes

未压缩尺寸 4 bytes

这个数据描述符只在全局方式位标记的第3位设为1时才存在(见后详解),紧接在压缩数据的最后一个字节后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。


2)压缩源文件目录区

在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据

组成 长度

目录中文件文件头标记 4 bytes (0x02014b50)

压缩使用的pkware 版本 2 bytes

解压文件所需 pkware 版本 2 bytes

全局方式位标记 2 bytes

压缩方式 2 bytes

最后修改文件时间 2 bytes

最后修改文件日期 2 bytes

CRC-32校验 4 bytes

压缩后尺寸 4 bytes

未压缩尺寸 4 bytes

文件名长度 2 bytes

扩展字段长度 2 bytes

文件注释长度 2 bytes

磁盘开始号 2 bytes

内部文件属性 2 bytes

外部文件属性 4 bytes

局部头部偏移量 4 bytes

文件名 (不定长度)

扩展字段 (不定长度)

文件注释 (不定长度)


3)压缩源文件目录结束标志

组成 长度

目录结束标记 4 bytes (0x02014b50)

当前磁盘编号 2 bytes

目录区开始磁盘编号 2 bytes

本磁盘上纪录总数 2 bytes

目录区中纪录总数 2 bytes

目录区尺寸大小 4 bytes

目录区对第一张磁盘的偏移量 4 bytes

ZIP 文件注释长度 2 bytes

ZIP 文件注释 (不定长度)

Python 相关文章推荐
python万年历实现代码 含运行结果
May 20 Python
基于Python闭包及其作用域详解
Aug 28 Python
python中requests库session对象的妙用详解
Oct 30 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
python机器学习之随机森林(七)
Mar 26 Python
破解安装Pycharm的方法
Oct 19 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
Python实现CAN报文转换工具教程
May 05 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
10个示例带你掌握python中的元组
Nov 23 Python
python 数据加密代码
Dec 24 #Python
python 测试实现方法
Dec 24 #Python
Python 面向对象 成员的访问约束
Dec 23 #Python
pymssql ntext字段调用问题解决方法
Dec 17 #Python
python 图片验证码代码
Dec 07 #Python
下载糗事百科的内容_python版
Dec 07 #Python
python 参数列表中的self 显式不等于冗余
Dec 01 #Python
You might like
PHP新手上路(六)
2006/10/09 PHP
上传多个文件的PHP脚本
2006/11/26 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
2017/02/23 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
2019/06/10 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
django的model操作汇整详解
2019/07/26 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
飞利浦美国官网:Philips美国
2020/02/28 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
如何撰写岗位职责
2014/02/01 职场文书
《落花生》教学反思
2014/02/25 职场文书
竞争上岗实施方案
2014/03/21 职场文书
管理标语大全
2014/06/24 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android