Python打开zip文件

    Zip文件格式是通用的文档压缩标准。自1.6版本起,Python中zipfile模块能够直接处理zip文件里的数据,例如需要将对应目录或多个文件打包或压缩成zip格式,或者需要查看一个zip格式的归档文件中部分或者所有文件同时避免讲这些文件展开到磁盘上。使用ZipFile类来操作zip文件。

创建一个ZipFile对象,表示一个zip文件。

    \bullet 参数file:文件的路径或者类似文件对象

    \bullet 参数mode:读"r",写入"w",添加"a"

    \bullet 参数compression: ZIP_STORED(无压缩),ZIP_DEFLATED(压缩,需要zlib支持)

    \bullet 参数allowZip64:默认情况下报错,将其设为True,ZipFile将用ZIP64扩展进行创建文件。

解压ZIP文档中的所有文件到指定目录

下面示例演示了读取一个zip文档,将文档里所有文件解压到名为"work"的文件里。

import zipfile

if __name__ == "__main__":

    zFile = zipfile.ZipFile("F:\\txt.zip","r")

    #ZipFile.namelist():获取ZIP文档内所有文件的名称列表

    for fileM in zFile.namelist():

        zFile.extract(fileM,"F:\\work")

        zFile.close()


读取ZIP文档内某个文件

read(self,name,pwd=None)获取ZIP文档内文件的二进制数据

下面例子演示了使用read方法获取ZIP文档中mango.txt文件的数据,并写到copy.txt文件中

import zipfile 

if __name__ == "__main__":

    zipFile = zipfile.ZipFile('F:\\test.zip','r')

    data = zipFile.read("mango.txt")

    (lambda f,d:(f.write(d),f.close()))(open("F:\\copy.txt,'w"),data)

    zipFile.close()


将文件生成ZIP文档

write(self, filename, arcname=None, compress_type=None)将指定文件写入ZIP文档中

    \star 参数filename:需要写入文件的路径

    \star 参数arcname:文件写入ZIP文档后保存的文件名

    \star 参数compress_type:压缩方法(ZIP_STORED或ZIP_DEFAULED)

下面离子演示了创建一个zip文档,将test.docx文件写入压缩文档里面。

import zipfile

if __name__ == "__main__":

    zipFile = zipfile.ZipFile("F:\\test.zip","w")

    zipFile.write("F:\\test.docx","ok.docx",zipfile.ZIP_DEFLATED)

    zipFile.close()


获取ZIP文档中某个文件的信息

getinfo(name)返回一个ZipInfo类的对象。

import zipfile

if __name__ == "__main__":

    zipInfo = zipFile.getinfo(ok.docx)

    print("filename:",zipInfo.filename)

    print("date_time:",zipInfo.date_time)

常用函数

ZipFile.close()

关闭归档文件,你必须在退出程序之前调用close()否则将不会写入关键记录数据。

ZipFile.getinfo(name)

返回一个ZipInfo对象,其中包含有关归档成员name的信息。针对一个目前并不包含于归档中的名称调用getinfo()将会引发KeyError。

ZipFile.infolist()

   返回一个列表,其中包含每个归档成员的ZipInfo对象。如果是打开一个现有归档则这些对象的排列顺序与他们对于条目在磁盘上的实际ZIP文件中的顺序一致。

ZipFile.namelist()

返回按名称排列的归档成员列表。

ZipFile.open(name,mode='r',pwd=None,*,force_zip64=False)

以二进制文件类对象的形式访一个归档成员。name可以是归档内某个文件的名称也可以是某个ZipInfo对象。如果包含了mode形参,则它必须为"r"(默认值)或"w"。pwd为用于解密已加密Zip文件的密码。

open()也是一个上下文 管理器,因此支持with语句:

with ZipFile('spam.zip') as myzip:

    with myzip.open('eggs.txt') as myfile:

    print(myfile.read())

如果mode为“r”则文件类对象(ZipExtFile)将只读并且提供下列方法:read(),readline(),readlines(),seek(),tell(),__iter__(),__next__()。这些对象可独立于ZipFile进行操作。

如果mode='w'则返回一个可写入的文件句柄,它将支持write()方法。当一个可写入的文件句柄被打开时,尝试读写ZIP文件中的其他文件将会引发ValueError。

当写入一个文件时,如果文件大小不能预先确定但是可能超过2GiB,可传入force_zip64=True以确保标头格式能够支持超大文件。如果文件大小可以预先确定,则在构造ZipInfo对象时应设置file_size,并将其作name形参。

ZipFile.extract(member,path=None,pwd=None)

从归档中提取一个成员放入当前工作目录;member必须为成员的完整名称或ZipInfo对象。成员的文件信息会尽可能精确地被提取。path指定一个要提取到的不同目录。member可以是一个文件名或ZipInfo对象。pwd是用于解密文件的密码。返回所创建的经正规化的路径(对应于目录或新文件)。

注解:如果一个成员文件名为绝对路径,则将去掉驱动器/UNC共享点和前导的(反)斜杠,例如: ///foo/bar 在 Unix 上将变为 foo/bar,而 C:\foo\bar 在 Windows 上将变为 foo\bar。 并且一个成员文件名中的所有 ".." 都将被移除,例如: ../../foo../../ba..r 将变为 foo../ba..r。 在 Windows 上非法字符 (:, <, >, |, ", ?, and *) 会被替换为下划线 (_)


ZipFile.extractall(path=None,members=None,pwd=None)

从归档中提取出所有成员放入当前工作目录。path指定一个要提取到的不同的目录。members为可选项且必须为namelist()所返回列表的一个子集。pwd是用于解密文件的密码。

警告:绝不要未经预先检验就从不可靠的源中提取归档文件。 这样有可能在 path 之外创建文件,例如某些成员具有以 "/" 开始的文件名或带有两个点号 ".." 的文件名。 此模块会尝试防止这种情况。 参见 extract() 的注释。

ZipFile.printdir()

将归档是目录表打印到sys.stdout.

ZipFile.setpassword(pwd)

设置pwd为用于提取已加密文件的默认密码。

ZipFile.read(name,pwd=None)

返回归档中文件name的字节数据。name是归档中文件的名称,或是一个ZipInfo对象。归档必须以读取或追加方式打开。pwd为用于已加密文件的密码,并且如果指定该参数则它将覆盖通过setpassword()设置的默认密码。 on a ZipFile that uses a compression method 在使用 ZIP_STORED , ZIP_DEFLATEDZIP_BZIP2 或 ZIP_LZMA 以外的压缩方法的 ZipFile 上调用 read() 将引发 NotImplementedError。 如果相应的压缩模块不可用也会引发错误。

ZipFile.testzip()

读取归档中的所有文件并检查他们的CRC和文件头。返回第一个已损坏文件的名称,在其他情况下则返回None。

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

将名为filename的文件写入归档,给予的归档名为arcname(默认情况下将与filename一致,但是不带驱动器盘符并会移除开头的路径分隔符)。compress_type如果给出,它将覆盖作为构造器compression形参对于新条目所给出的值。类似地,compresslevel如果给出也将覆盖构造器。归档必须使用"w","x“或"a"模式打开。

ZipFile.writestr(zinfo_or_arcnamedatacompress_type=Nonecompresslevel=None)

将一个文件写入归档。 内容为 data,它可以是一个 str 或 bytes 的实例;如果是 str,则会先使用 UTF-8 进行编码。 zinfo_or_arcname 可以是它在归档中将被给予的名称,或者是 ZipInfo 的实例。 如果它是一个实例,则至少必须给定文件名、日期和时间。 如果它是一个名称,则日期和时间会被设为当前日期和时间。 归档必须以 'w', 'x' 或 'a' 模式打开。

ZipFile.filename()

ZIP文件的名称

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容