python_Zipfile库

因为近期nepCTF2022和练习都碰到了压缩包套娃的题目,写了两个脚本,在这里记录一下zipfile的学习。

简介

标准库zipfile,可以用来处理压缩文件。
zipfile是一个用来压缩文件和解压缩文件的模块,它有两个常用的类,分别是ZipFile和ZipInfo。
其中ZipFile是主要的类,用来创建和读取zip文件,而ZipInfo是存储的zip文件的每个文件的信息的。

ZipFile对象

ZipFile 对象在概念上与 File 对象相似。
官方文档定义:

1
2
3
4
5
6
7
打开一个 ZIP 文件,file 为一个指向文件的路径(字符串),一个类文件对象或者一个 path-like object
形参 mode 应当为 'r' 来读取一个存在的文件,'w' 来截断并写入新的文件, 'a' 来添加到一个存在的文件,
或者 'x' 来仅新建并写入新的文件。如果 mode 为 'x' 并且 file 指向已经存在的文件,
则抛出 FileExistsError。如果 mode 为 'a' 且 file 为已存在的文件,则格外的文件将被加入。
如果 file 不指向 ZIP 文件,之后一个新的 ZIP 归档将被追加为此文件。
这是为了将 ZIP 归档添加到另一个文件(例如 python.exe)。
如果 mode 为 'a' 并且文件不存在, 则会新建。如果 mode 为 'r''a', 则文件应当可定位。

ZipInfo对象

通过ZipFile的getinfo方法得到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: 获取未压缩的文件大小。
ZipInfo相关属性

ZipInfo.filename 获取文件名称。

ZipInfo.date_time 获取文件最后修改时间。返回一个包含6个元素的元组:(年, 月, 日, 时, 分, 秒)

ZipInfo.compress_type 压缩类型。

ZipInfo.comment 文档说明。

ZipInfo.extr 扩展项数据。

ZipInfo.create_system 获取创建该zip文档的系统。

ZipInfo.create_version 获取、创建zip文档的PKZIP版本。

ZipInfo.extract_versio 获取、解压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.创建一个 ZipFile 对象

要创建一个 ZipFile对象,就调用 zipfile.ZipFile()函数,向它传入一个字符串,表示.zip文件的文件名。请注意,zipfile 是 Python 模块的名称,ZipFile()是函数的名称。ZipFile 的构造方法有两个参数,第一个参数是必选参数,接受一个字符串格式的压缩包名称,第二个参数为可选参数,表示打开模式,类似于文件操作,有r/w/a三种模式,分别代表读、写、添加,默认为r,即读模式。压缩使用w,解压缩使用r。

mode可以省略
压缩需要把mode改为‘w’

1
zfile=zipfile.ZipFile("test.zip","w")

解压需要把mode改为‘r’

1
zfile=zipfile.ZipFile("test.zip","r")

2.添加压缩文件 or 选择解压文件

需要使用的方法

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

从归档中提取出一个成员放入当前工作目录;member 必须为成员的完整名称或 ZipInfo 对象。
成员的文件信息会尽可能精确地被提取。 path 指定一个要提取到的不同目录。
member 可以是一个文件名或 ZipInfo 对象。 pwd 是用于解密文件的密码。

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

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

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

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

第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。可以总是将这个值设置为zipfile.ZIP_DEFLATED(这指定了 deflate 压缩算法,它对各种类型的数据都很有效)。

ZipFile.close()

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

实例

写入压缩文件

1
2
zfile.write(r"../test.py")
zfile.close()//关闭对象

解压文件

1
2
3
zfile.extractall()//解压所有文件
zfile.extract(r"test.py")//解压指定文件
zfile.close()//关闭对象

3.其他常见方法

ZipFile.getinfo(name)

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

ZipFile.infolist()

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

ZipFile.namelist()

返回按名称排序的归档成员列表(也就是压缩包里的文件名)。

参考文章

https://docs.python.org/zh-cn/3/library/zipfile.html#zipfile.ZIP_BZIP2

https://www.cnblogs.com/wangylblog/p/13925894.html

https://blog.csdn.net/sinat_38682860/article/details/114176182