zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操做zip文件,下面具体介绍一下:python
class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]).net
建立一个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。code
ZipFile还提供了以下经常使用的方法和属性:对象
ZipFile.getinfo(name):
获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。将在下面 具体介绍该对象。blog
ZipFile.infolist() 获取zip文档内全部文件的信息,返回一个zipfile.ZipInfo的列表。ip
ZipFile.namelist() 获取zip文档内全部文件的名称列表。资源
ZipFile.extract(member[, path[, pwd]])文档
将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹;参数pwd为解压密码。下面一个例子将保存在程序根目录下的txt.zip内的全部文件解压到D:/Work目录:get
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() 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() #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() 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()
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,真爽!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JGood/archive/2009/07/15/4351911.aspx
================ Python 解压缩zip文件 2010-01-28 16:11
import zipfile
ZipFile里有两个很是重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的状况下,咱们只须要使用这两个class就能够了。ZipFile是主要的类,用来建立和读取zip文件而ZipInfo是存储的zip文件的每一个文件的信息的。
好比要读取一个Python ZipFile模块,这里假设filename是一个文件的路径:
import ZipFile z = ZipFile.ZipFile(filename, 'r') # 这里的第二个参数用r表示是读取zip文件,w是建立一个zip文件 for f in z.namelist(): print f
上面的代码是读取一个zip压缩包里全部文件的名字。z.namelist() 会返回压缩包内全部文件名的列表。
再看看下面一个:
import ZipFile z = ZipFile.ZipFile(filename, 'r') for i in z.infolist(): print i.file_size, i.header_offset
这里使用了z.infolist(), 它返回的就是压缩包内全部文件的信息,就是 一个ZipInfo的列表。一个ZopInfo对象中包含了压缩包内一个文件的信息,其中比较经常使用的是 filename, file_size, header_offset, 分别为文件名,文件大小,文件数据在压缩包中的偏移。其实以前的z.namelist()就是读取的ZopInfo中的filename,组成一个 list返回的。 从压缩包里解压缩出一个文件的方法是使用ZipFile的read方法:
import ZipFile z = ZipFile.ZipFile(filename, 'r') print z.read(z.namelist()[0])
这样就读取出z.namelist()中的第一个文件,而且输出到屏幕,固然也能够把它存储到文件。
下面是建立zip压缩包的方法:
与读取的方法其实很相似的:
import ZipFile, os z = ZipFile.ZipFile(filename, 'w') # 注意这里的第二个参数是w,这里的filename是压缩包的名字
假设要把一个叫testdir中的文件所有添加到压缩包里(这里只添加一级子目录中的文件):
if os.path.isdir(testdir): for d in os.listdir(testdir): z.write(testdir+os.sep+d) # close() 是必须调用的! z.close()
上面的代码很是的简单。想一想还有一个问题,若是我把一个test/111.txt 添加到压缩包里以后我但愿在包里它放到test22/111.txt怎么办呢?其实这个就是Python ZipFile模块的write方法中第二个参数的做用了。只须要这样调用:
z.write("test/111.txt", "test22/111.txt")
以上就是咱们为你们介绍的有关Python ZipFile模块的相关知识。
=============== 从简单的角度来看的话,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 文件注释 (不定长度)