写一个带忽略名单的打包压缩脚本

人生苦短,我用Python

image.png

前几天朋友让我把手里的一个Android demo项目打个压缩包发给他,于是我试着直接对项目进行打包,好家伙,19M那么大,明明没几行代码.肯定是app/build文件夹惹的祸,一看才发现它有64M那么大,然后因为build是在app这个目录下,压缩的时候只能把app这个文件夹整个打包进去,可是我又不想要app目录下的build文件夹,于是我选择用Python写一个个性化压缩工具.只需要双击脚本就可以自动打包好这个项目.

首先我通过搜索找到Python有个自带的标准库 zipfile 通过这个库就可以把文件和目录打包进zip里.

首先引包,然后创建一个压缩包对象

import zipfile
zip = zipfile.ZipFile('test.zip',mode='w',compression=zipfile.ZIP_BZIP2)

跟open()差不多的,test.zip 是文件名,mode='w' 就是写入的意思,也可以写 'a' 表示追加,compression表示压缩方法.

然后向压缩包添加一个文件,添加完了后一定要close()

zip.write('README.md')
zip.close()

好了,zipfile库的基础用法就这样了,当然你也可以用它解压压缩包,下面开始编写我的个性化压缩工具

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'JethroCup'

import zipfile
import os
output='out.zip' #输出文件名
ignore = ['build'] #忽略的文件或目录
ignore.append(output) #忽略输出的文件名,如果不忽略将产生死循环

代码中定义了一个ignore变量,就是我们的忽略名单了,当我们的文件遍历方法遍历到名单中的文件或文件夹名时将会当作没看到这个文件.
上文件遍历方法

def dfs_get_zip_file(input_path,result):
    '''
    遍历文件和目录的路径
    input_path:要遍历那个文件夹
    result:存储路径的list,遍历到的路径将存储在这个变量中
    '''
    files = os.listdir(input_path)
    for file in files:
        #筛选出忽略列表中的文件和目录
        if file in ignore:
            continue
        if os.path.isdir(input_path+'/'+file):
            dfs_get_zip_file(os.path.join(input_path,file),result)
        else:
            result.append(os.path.join(input_path,file))

遍历出了所有文件路径后,我们就将他们一一write进zip中

def autozip():
    '''
    自动打包压缩
    '''
    zip = zipfile.ZipFile(output,mode='w',compression=zipfile.ZIP_BZIP2)

    filelist=[] #存储遍历到的路径
    dfs_get_zip_file('.',filelist)
    for file in filelist:
        print(file)
        zip.write(file)
    zip.close()

OK,最后

if __name__ == "__main__":
    autozip()
    input('已压缩至 {}'.format(output))

双击6666双击运行试试看效果
image.png

添加新评论