python打包压缩目录,支持子目录,支持过滤目录和文件类型,压缩包内路径从当前开始,而不是从盘符开始的长路径

网上要么没有,要么方法都是不对的。
直接上代码,应该注释挺清楚了,不多说了^_^

import os
import sys
import zipfile

#获取脚本路径, 如果是在IDE下运行,只能用此方式获取
def get_cur_dir():
    path = sys.path[0]
    #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
    if os.path.isdir(path):
        return path

    elif os.path.isfile(path):
        return os.path.dirname(path)

def recurse_files(input_path, result):
    files = os.listdir(input_path)

    for file in files:
        if os.path.isdir(os.path.join(input_path,file)):
            if file != 'users': #过滤文件夹
                recurse_files(os.path.join(input_path,file), result)
        else:
            ext = os.path.splitext(file)[1]
            if input_path == cur_dir:#根目录只添加特定类型文件
                if ext == '.dll' or ext == '.exe' or ext == '.qm':
                    result.append(os.path.join(input_path,file))
            else:
                result.append(os.path.join(input_path,file))

if __name__ == '__main__':
    cur_dir = get_cur_dir()

    zip_file_name = os.path.join(cur_dir, 'debug.zip');
    if os.path.isfile(zip_file_name): os.remove(zip_file_name)
    zip = zipfile.ZipFile(zip_file_name, 'w', zipfile.ZIP_DEFLATED)

    filelists = []
    recurse_files(cur_dir, filelists)

    for file in filelists:
        arcName = file #在压缩包内名字
        if os.path.dirname(file) == cur_dir:
            arcName = os.path.basename(file) #文件在要压缩目录下,则只为文件名
        else:
            dir = os.path.dirname(file)
            dir = dir.replace(cur_dir + '\\', '') #只从要压缩的目录下当前目录名开始
            arcName = dir + '\\' + os.path.basename(file)

        zip.write(file, arcName)
        #zip.write(file) #会出现全路径

    # 调用了close方法才会保证完成压缩
    zip.close()
        

    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值