Python中的zipfile模块使用详解


Posted in Python onJune 25, 2015

zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下:
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

创建一个ZipFile对象,表示一个zip文件。参数file表示文件的路径或类文件对象(file-like object);参数mode指示打开zip文件的模式,默认值为'r',表示读已经存在的zip文件,也可以为'w'或'a','w'表示新建一个zip文档或覆盖一个已经存在的zip文档,'a'表示将数据附加到一个现存的zip文档中。参数compression表示在写zip文档时使用的压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。如果要操作的zip文件大小超过2G,应该将allowZip64设置为True。

ZipFile还提供了如下常用的方法和属性:
ZipFile.getinfo(name):

获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。将在下面 具体介绍该对象。
ZipFile.infolist()

获取zip文档内所有文件的信息,返回一个zipfile.ZipInfo的列表。
ZipFile.namelist()

获取zip文档内所有文件的名称列表。
ZipFile.extract(member[, path[, pwd]])

将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹;参数pwd为解压密码。下面一个例子将保存在程序根目录下的txt.zip内的所有文件解压到D:/Work目录:
 

import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
for file in zipFile.namelist():
  zipFile.extract(file, r'd:/Work')
zipFile.close()
ZipFile.extractall([path[, members[, pwd]]])

解压zip文档中的所有文件到当前目录。参数members的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。
ZipFile.printdir()

将zip文档内的信息打印到控制台上。
ZipFile.setpassword(pwd)

设置zip文档的密码。
ZipFile.read(name[, pwd])

获取zip文档内指定文件的二进制数据。下面的例子演示了read()的使用,zip文档内包括一个txt.txt的文本文件,使用read()方法读取其二进制数据,然后保存到D:/txt.txt。
 

#coding=gbk
import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
data = zipFile.read('txt.txt')
(lambda f, d: (f.write(d), f.close()))(open(r'd:/txt.txt', 'wb'), data) 
#一行语句就完成了写文件操作。仔细琢磨哦~_~
zipFile.close()
ZipFile.write(filename[, arcname[, compress_type]])

将指定文件添加到zip文档中。filename为文件路径,arcname为添加到zip文档之后保存的名称, 参数compress_type表示压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。下面的例子演示了如何创建一个zip文档,并将文件D:/test.doc添加到压缩文档中。
 

import zipfile, os
zipFile = zipfile.ZipFile(r'D:/test.zip'), 'w')
zipFile.write(r'D:/test.doc', 'ok.doc', zipfile.ZIP_DEFLATED)
zipFile.close()
ZipFile.writestr(zinfo_or_arcname, bytes)

writestr()支持将二进制数据直接写入到压缩文档。
Class ZipInfo

ZipFile.getinfo(name) 方法返回的是一个ZipInfo对象,表示zip文档中相应文件的信息。它支持如下属性:

  • ZipInfo.filename: 获取文件名称。
  • ZipInfo.date_time: 获取文件最后修改时间。返回一个包含6个元素的元组:(年, 月, 日, 时, 分, 秒)
  • ZipInfo.compress_type: 压缩类型。
  • ZipInfo.comment: 文档说明。
  • ZipInfo.extr: 扩展项数据。
  • ZipInfo.create_system: 获取创建该zip文档的系统。
  • ZipInfo.create_version: 获取 创建zip文档的PKZIP版本。
  • ZipInfo.extract_version: 获取 解压zip文档所需的PKZIP版本。
  • ZipInfo.reserved: 预留字段,当前实现总是返回0。
  • ZipInfo.flag_bits: zip标志位。
  • ZipInfo.volume: 文件头的卷标。
  • ZipInfo.internal_attr: 内部属性。
  • ZipInfo.external_attr: 外部属性。
  • ZipInfo.header_offset: 文件头偏移位。
  • ZipInfo.CRC: 未压缩文件的CRC-32。
  • ZipInfo.compress_size: 获取压缩后的大小。
  • ZipInfo.file_size: 获取未压缩的文件大小。

下面一个简单的例子说明这些属性的意思:
 

import zipfile, os
zipFile = zipfile.ZipFile(os.path.join(os.getcwd(), 'txt.zip'))
zipInfo = zipFile.getinfo('doc.doc')
print 'filename:', zipInfo.filename
print 'date_time:', zipInfo.date_time
print 'compress_type:', zipInfo.compress_type
print 'comment:', zipInfo.comment
print 'extra:', zipInfo.extra
print 'create_system:', zipInfo.create_system
print 'create_version:', zipInfo.create_version
print 'extract_version:', zipInfo.extract_version
print 'extract_version:', zipInfo.reserved
print 'flag_bits:', zipInfo.flag_bits
print 'volume:', zipInfo.volume
print 'internal_attr:', zipInfo.internal_attr
print 'external_attr:', zipInfo.external_attr
print 'header_offset:', zipInfo.header_offset
print 'CRC:', zipInfo.CRC
print 'compress_size:', zipInfo.compress_size
print 'file_size:', zipInfo.file_size
zipFile.close()

感觉使用zipfile模块来处理zip文件真的很简单。想当初在.NET平台下,使用sharpziplib压缩、解压一个文件,我花了N多时间,找了N多英文资源,才写出一个能压缩文件的demo。而现在使用Python,通过阅读python手册,一两个小时就掌握了zipfile模块的基本使用。哈哈,使用Python,真爽!

Python 相关文章推荐
python网络编程之文件下载实例分析
May 20 Python
深入解析Python中的集合类型操作符
Aug 19 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
图文详解python安装Scrapy框架步骤
May 20 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
解析python的局部变量和全局变量
Aug 15 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
浅析python 动态库m.so.1.0错误问题
May 09 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 Python
Python实现保证只能运行一个脚本实例
Jun 24 #Python
Python中的默认参数详解
Jun 24 #Python
Python中的下划线详解
Jun 24 #Python
Python装饰器使用实例:验证参数合法性
Jun 24 #Python
Python线程详解
Jun 24 #Python
Python函数式编程指南(四):生成器详解
Jun 24 #Python
Python函数式编程指南(三):迭代器详解
Jun 24 #Python
You might like
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP实现简单的计算器
2020/08/28 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
增大python字体的方法步骤
2020/07/05 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
铁路安全事故反思
2014/04/26 职场文书
小学元宵节活动总结
2015/02/06 职场文书
大学生入党自荐书
2015/03/05 职场文书