文档章节

zipfile

浅夏
 浅夏
发布于 2013/08/15 16:45
字数 3252
阅读 175
收藏 0
  1. 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() 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文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。

  1. 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()支持将二进制数据直接写入到压缩文档。

  1. 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: 获取未压缩的文件大小。

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

  1. 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

def unzip(): zip_path="c://a.zip" save_path = "c://a" zipfile.ZipFile(zip_path).extractall(save_path)

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.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文件


  1. 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 文件注释 (不定长度)

© 著作权归作者所有

共有 人打赏支持
浅夏
粉丝 12
博文 57
码字总数 51761
作品 0
海淀
程序员
iOS开发-用ZipArchive添加和解压zip包

ZipArchive是一个开源的zip开发包工具。 使用方法如下: 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilename需要一个完整得路径,例如***/Documents...

TomatosX
2015/09/04
1K
0
Python ZipFile模块详解

Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile是主要...

Betty__
2016/10/09
23
0
Python zipfile模块

Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile是主要...

writeademo
2016/07/27
5
0
update.zip进行签名不成功

对update.zip进行签名不成功错误代码如下 求大神赐教!!!! 自动签名工具 By www.angeeks.com 开始签名你放在目录里的zip文件 java.lang.IllegalArgumentException: MALFORMED at java.util.z...

lijiahui-a
2013/08/29
546
0
Java ZIP解压优化过程

场景:288K 的jar 文件,包含大概100个文件 版本一:1700ms 版本二,耗时:450ms-470ms 版本三,耗时:130ms-150ms 关于结论 读和写都使用缓冲能提高性能,目前没有使用工具类。common-io之类的...

唐代de豆腐
2016/08/30
34
0

没有更多内容

加载失败,请刷新页面

加载更多

Flask 开发填坑

插件的选择: flask-security 真的是个鸡肋啊。自带的页面,好丑。还不如用flask-login来做呢。

pearma
7分钟前
0
0
讲述下 :LVM逻辑卷管理遇到的问题

LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) 由于是最小化安装没有xfs命令,yum安装如下包支持此...

linuxprobe16
43分钟前
0
0
day95-20180922-英语流利阅读-待学习

Hey Jude 半个世纪传唱不衰的背后故事 毛西 2018-09-22 1.今日导读 2004 年,The Beatles 被《滚石》杂志选为“历史上最伟大的 50 位流行音乐家的第一位”。这四名来自英国利物浦的男孩不仅对...

飞鱼说编程
50分钟前
1
0
OSChina 周六乱弹 —— 放假前期焦虑症晚期

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Matteo的单曲《Panama》: 《Panama》- Matteo 手机党少年们想听歌,请使劲儿戳(这里) @新垣吉衣OSC :我发现只要去有小朋友...

小小编辑
今天
179
10
wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部