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
版权声明:本文标题:supersu 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1702087203a534448.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论