Python 基础 之 zipfile 文件夹压缩/解压方法的简单整理
目录
Python 基础 之 zipfile 文件夹压缩/解压方法的简单整理
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里介绍使用 zipfile 进行文件夹的压缩,并且zipfile 进行解压压缩包,这里简单介绍,方法不唯一,如果不足或更好的方法,还请留言补充。
zipfile 常用函数
0)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。
1)ZipFile.getinfo(name)
功能:获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。将在下面 具体介绍该对象。
2)ZipFile.infolist()功能:获取zip文档内所有文件的信息,返回一个zipfile.ZipInfo的列表。
3)ZipFile.namelist()
功能:获取zip文档内所有文件的名称列表。
4)ZipFile.extractall(member[, path[, pwd]])功能:将zip文档内的指定文件解压到当前目录。
参数:
- member 指定要解压的文件名称或对应的ZipInfo对象
- path 指定解析文件保存的文件夹
- pwd 解压密码
from zipfile import ZipFile, BadZipfile with ZipFile(zip_path, "r") as archive: try: archive.extractall(path=extract_path, pwd=password) except BadZipfile: print("Invalid Zip file")
5)ZipFile.extract(member[, path[, pwd]])
功能:将zip文档内的指定文件解压到当前目录。
参数:
- member 指定要解压的文件名称或对应的ZipInfo对象
- path 指定解析文件保存的文件夹
- pwd 解压密码
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()
6)ZipFile.printdir()
功能:将zip文档内的信息打印到控制台上。
功能:设置zip文档的密码。
功能:获取zip文档内指定文件的二进制数据。
9)ZipFile.write(filename[, arcname[, compress_type]])
功能:将指定文件添加到zip文档中。
参数:
filename 文件路径
arcname 添加到zip文档之后保存的名称
compress_type 压缩方法,它的值可以是zipfile.ZIP_STORED 或zipfile.ZIP_DEFLATED10)ZipFile.writestr(zinfo_or_arcname, bytes)
功能:writestr()支持将二进制数据直接写入到压缩文档。
11)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_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 获取未压缩的文件大小
二、zipfile 压缩
1、压缩文件夹
import os
import zipfile
def zipDir(source_dir, output_filename):
"""
压缩指定文件夹
:param source_dir: 目标文件夹路径
:param output_filename: 压缩文件保存路径+xxxx.zip
:return: 无
"""
if os.path.exists(source_dir):
# compression压缩比例,默认是不压缩,ZIP_LZMA=14级别的压缩,影响的是时间,但是包能更小
# vue使用级别=9的,var archive = archiver('zip', {zlib: {level: 9}});
# mac install: brew install xz
# mode 解压是 r , 压缩是 w 追加压缩是 a
# compression 为 zipfile.ZIP_DEFLATED,zipfile.ZIP_STORED, zipfile.ZIP_LZMA
zipf = zipfile.ZipFile(file=output_filename, mode='w', compression=zipfile.ZIP_LZMA)
# zipf = zipfile.ZipFile(file=output_filename, mode='w', compression=zipfile.ZIP_DEFLATED)
pre_len = len(os.path.dirname(source_dir))
for parent, dirnames, filenames in os.walk(source_dir):
for filename in filenames:
pathfile = os.path.join(parent, filename)
arcname = pathfile[pre_len:].strip(os.path.sep) # 相对路径
zipf.write(pathfile, arcname)
zipf.close()
return output_filename
return
zipDir(
r'E:\ssxx\T0xB0',
r'E:\ssxx\T0xB0_level_14.zip')
2、压缩指定扩展名文件
def zip_file_by_extension(src_dir, extension='dll', save_name='default'):
'''
根据文件扩展名筛选需要压缩的文件到压缩包
注:针对单层目录情况,文件夹下的子文件不会被压缩
'''
if save_name == 'default':
zip_name = src_dir + '.zip'
else:
if save_name is None or save_name == '':
zip_name = src_dir + '.zip'
else:
zip_name = save_name + '.zip'
z = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
file_list = os.listdir(src_dir)
for filename in tqdm(file_list):
if not os.path.isfile(os.path.join(src_dir, filename)):
continue
if filename.split('.')[-1] == extension:
print(r'正在压缩文件:', filename, end='')
z.write(os.path.join(src_dir, filename), filename)
z.close()
return True
三、zipfile 进行简单压缩包解压
1、解压压缩包
def unzip_file(zip_src, dst_dir):
'''
解压缩
'''
r = zipfile.is_zipfile(zip_src)
if r:
fz = zipfile.ZipFile(zip_src, 'r')
for file in fz.namelist():
fz.extract(file, dst_dir)
else:
print('This is not zip')
return False
return True