admin管理员组

文章数量:1122909

supersu

本文约2380字,建议阅读时间12~15分钟

关键字:python,zip,压缩文件,zipfile

python标准库中提供了主流压缩文件格式(如gz、tar、zip等)的压缩与解压,如操作gz格式的gzip,tar格式的tarfile、zip格式的zipfile,其中zip文件是一种常用压缩标准文档。

1、异常

(1)zipfile.BadZipFile

#不标准的zip文件抛出的错误

(2)zipfile.LargeZipFile

#不是用ZIP64标准压缩的zip文件抛出的错误

2、常量

(1)zipfile.ZIP_STORED

#未压缩文档成员的数值型常数

(2)zipfile.ZIP_DEFLATED

#常用zip压缩方法的数值型常数,需要zlib模块

(3)zipfile.ZIP_BZIP2

#BZIP2压缩方法的数值型常数,需要bz2模块

(4)zipfile.ZIP_LZMA

#LZMA压缩方法的数值型常数,需要lzma模块

3、公共方法

判断文件是否为有效的zip文件

is_zipfile(filename)

#filename为文件或者类似文件的对象

4、ZipFile类

(1)对象的创建

from zipfile import ZipFile

zfile=ZipFile(file,mode=’r’,compression=ZIP_STORED,allowZip64=True,

compresslevel=None,strict_timestamps=True)

#file为文件名或者文件对象

#mode包括’r’、’w’、’a’、‘x’

#compression可以设置为上述常数中任一值

#allowZip64为True时表示将创建用ZIP64扩展的zip文件

#compressleve控制zip压缩层级,选择ZIP_STORED、ZIP_LZMA没有影响,ZIP_DEFLATED接受0-9的整数,ZIP_BZIP2接受1-9的整数

#strict_timestamps为python3.8引入,为True时,接受1980-01-01到2107-12-31之间的时间戳

假设在当前工作目录(如E:\my_project)下存在如下的zip压缩文件:

zf=ZipFile('E:\my_project\zipfile_sample.zip')

(2)压缩文件信息的操作方法

关闭文件

zf.close()

获取压缩文件信息

zf.infolist()

#返回压缩文件下成员文件的信息列表,包括filename、compress_type、external_attr、file_size、compress_size等信息

获取压缩文件的成员文件名称

zf.namelist()

#返回['read.csv', 'write.csv']

获取压缩文件下某个名为name的信息

zf.getinfo('read.csv')

#返回

external_attr=0x20 file_size=35 compress_size=36>

打印出压缩文件目录信息表

zf.printdir()

#返回如下信息表:

File Name

Modified

Size

read.csv

2020-10-10 14:50:40

35

write.csv

2020-10-12 15:34:08

45

(3)压缩子文件的操作方法

打开压缩文件下的某个文件

read_file=zf.open('read.csv',mode='r',pwd=None)

print(read_file)

#返回b'1,2,3,4,5,\r\na,b,c,d,e,f\r\n!,@,#,,,\r\n'

#name可以是子文件名称,也可以是ZipInfo对象

如zf.open(zf.infolist()[0],mode='r',pwd=None)亦表示读取上述文件

#当mode为’r’时,读取文件可以采用 read(), readline(), readlines(), seek(), tell(), __iter__(), __next__()方法,当为’w’时,写入文件可以采用write()方法

#pwd是解密加密文件时的密码

#注:返回的是二进制数据

提取某个子文件到指定工作目录

zf.extract('write.csv',path=r'D:\工作\算法',pwd=None)

#返回创建的标准路径名’D:\工作\算法\write.csv’,并在指定路径path下生成指定的文件write.csv

#member参数既可以是文件名,也可以是ZipInfo对象,如zf.infolist()[1]

提取某些子文件到指定工作目录

zf.extractall(path=r'D:\工作\算法',members=zf.namelist(),pwd=None)

#将在目录'D:\工作\算法'下生成read.csv和write.csv文件

#members只能是子文件名称的子集

#pwd是加密文件的密码

为提取的加密文件设置密码

zf.setpassword(pwd)

读取某个子文件

zf.read('read.csv',pwd=None)

#返回b'1,2,3,4,5,\r\na,b,c,d,e,f\r\n!,@,#,,,\r\n'

#name可以是子文件名称,也可以是ZipInfo对象

#压缩文件应该以’r’或者’a’的方式打开

#注:读取的是二进制数据

压缩文件的校验

zf.testzip()

#对所有文件进行循环冗余校验并检查文件头,返回第一个错误的文件名,如果没有则返回None

向某个压缩文件写入某个文件

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

#arcname为压缩文档名,文档必须以'w', 'x'或'a'的模式打开

向某个压缩文件的某个文件写入字符

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

#zinfo_or_arcname为文件名称或者zipinfo对象,data为待写入的字符串或者字节,文档必须以'w', 'x'或'a'的模式打开

(4)相关属性

压缩文件的名称

zf.filename

#返回’E:\my_project\zipfile_sample.zip’

压缩文件调试

zf.debug

#返回0(默认,无输出)到3之间的数

压缩文件的注释

zfment

#返回字节信息

5、Path类

(1)创建path对象

path=zipfile.Path(root='E:\my_project\zipfile_sample.zip',at='read.csv')

#root为zip压缩文件的根路径

#at为压缩文件子文件的定位

(2)属性

最后路径名称

path.name

#返回'read.csv'

(3)方法

打开指定路径文件

path.open(mode=’r’)

#返回

#mode可以包含’r’,’w’,’rb’,’wb’

#python3.9增加支持文本和二进制模式,默认模式为文本

列举出当前路径的子路径

path_r=zipfile.Path('E:\my_project\zipfile_sample.zip')

list(path_r.iterdir())

#返回:

[Path('E:\\my_project\\zipfile_sample.zip', 'read.csv'), 

Path('E:\\my_project\\zipfile_sample.zip', 'write.csv')]

当前路径是否为目录

path_r.is_dir()

#返回True

当前路径是否为文件

path.is_file()

#返回True

当前路径是否存在

path.exists()

#返回True

读取当前文件为unicode字符串

path.read_text()

#返回'1,2,3,4,5,\na,b,c,d,e,f\n!,@,#,,,\n'

读取当前文件为bytes

path.read_bytes()

#返回b'1,2,3,4,5,\na,b,c,d,e,f\n!,@,#,,,\n'

6、ZipInfo类

ZipInfo类的实例是通过ZipFile对象的getinfo和infolist方法得到的,每个实例存储zip文档子文件的信息。

(1)方法

类方法

ZipInfo.from_file(filename,arcname=None,strict_timestamps=True)

#filename为文件系统上的文件或目录的路径字符串

#arcname为压缩文档名,如果没有设置将与filename一致

实例方法

当前zipinfo是否为压缩目录

zpif=zf.infolist()[0]

zpif.is_dir()

#返回False

(2)属性

文件名称

zpif.filename

#返回read.csv

最后修改时间

zpif.date_time

#返回(2020, 10, 10, 14, 50, 40)

#分别为年月日时分秒

压缩类型

zpifpress_type

#返回8

子文件二进制注释

zpifment

#返回b''

内部结构的二进制注释

zpif.extra

#返回:

b'\n\x00\x00\x00\x00\x00\x00\x01\x00\x18\x00\x94B\x9c\xab\xd1\x9e\xd6\x01\xf1\n\x9b\xab\xd1\x9e\xd6\x01\xa3{\x14\xd6\x08\x9e\xd6\x01'

创建zip压缩文件的系统

zpif.create_system

#返回0

创建zip压缩文件的版本

zpif.create_version

#返回31

抽取压缩文档的版本

zpif.extract_version

#返回20

是否保留

zpif.reserved

#必须为0

zip标志位

zpif.flag_bits

文件头容量

zpif.volume

内部属性

zpif.internal_attr

外部属性

zpif.external_attr

文件头的偏移字节

zpif.header_offset

循环冗余校验码

zpif.CRC

压缩大小

zpifpress_size

未压缩文件的大小

zpif.file_size

(完)

欢迎关注【lambda派】!

相关阅读:

术业有专攻:I/O流操作模块io

术业有专攻:逗号分割文件csv

术业有专攻:高阶函数模块functools

术业有专攻:数学计算模块math

术业有专攻:枚举类型enum模块

本文标签: supersu