编程快速上手 第9章 ZIP压缩与解压缩

#! 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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值