#! python3.8
#1.使用zipfile压缩文件夹(包含子文件夹、文件)
import os,zipfile
def zip_dir(dirname,zipfilename):
filelist = []
if os.path.isfile(dirname): # 判断是否文件
filelist.append(dirname) # 将文件加入列表
# 定义zipfile对象
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
# 遍历filelist列表
for tar in filelist:
# 将tar变量中的绝对路径,通过路径分隔符分割成列表
a = tar.split(os.path.sep)
# 定义变量,取值为a列表中倒数第2、倒数第1表项,在通过os.path.join方法组合路径
arcname = os.path.join(a[-2],a[-1])
# 以arcname变量中定义的格式,创建压缩包
zf.write(tar,arcname)
# 关闭
zf.close()
else :
for root, dirs, files in os.walk(dirname): # 非文件,执行遍历目录树
for name in files: # 遍历目录树中的文件列表
filelist.append(os.path.join(root, name)) # 将遍历出的文件,挨个加入列表
# 定义zipfile对象
zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
# 遍历filelist列表
for tar in filelist:
# 定义变量,取值为目录名称中的基本名称(即:最后一个目录名)+tar变量中字符串的切片
# 该切片中len方法目的是排除将要压缩文件夹之前的路径,仅取要压缩文件夹或文件的路径
# 目的是,这样创建的压缩包,里面不会包含压缩文件夹之前的绝对路径。
# 前面的目录基本名,也可不取,这样压缩包内就不会包含当前文件夹。
arcname =os.path.basename(dirname) + tar[len(dirname):]
print (arcname)
zf.write(tar,arcname)
zf.close()
# 2. 使用zipfile解压压缩包
def unzip_file(zipfilename,unziptodir):
zip_name = zipfile.ZipFile(zipfilename)
# 直接给extractall传递实参——要解压文件夹的位置,若文件夹不存在,会自动创建
zip_name.extractall(unziptodir)
zip_name.close()
if __name__ == '__main__':
# 无论传递文件夹实参,还是文件路径实参,都测试成功
zip_dir(r'D:\MMD\python\PY-atbook\c',r'D:\MMD\python\PY-atbook\new.zip')
# 要解压到 '测试\ABC' 下,无论路径是否存在,都测试成功
unzip_file(r'D:\MMD\python\PY-atbook\new.zip',r'D:\MMD\python\PY-atbook\测试\ABC')
编程快速上手 第9章 ZIP压缩与解压缩
最新推荐文章于 2024-09-15 22:31:42 发布