场景
- 我们在开发,测试,运维时,有时候需要手动压缩打包一些日志或者解压缩指定的
ZIP
文件进行分析。比如下载文件可以自动化,但是到解压的过程反而需要手动去解压缩,这个反复的工作会浪费大量的时间。所以我们如何使用Python
进行解压缩文件?
说明
-
Windows
上是没有压缩和解压缩zip
的命令的. 而Python
自带的库zipfile
可以解决这个问题,而且无需多少代码。 -
ZipHelper.py
既实现了解压缩整个zip
或指定压缩文件里的某个文件,也实现了压缩某个目录到zip
的功能. 我使用pyinstaller
打包为单个EXE
文件,方便使用, 当然也可以使用python ZipHelper.py
来调用。pyinstaller
是python 3.7
的第三方模块,需要通过pip install pyinstaller
安装。
pyinstaller -F --console ZipHelper.py
它的用法:
ZipHelper.exe --source 需要压缩的目录路径 --dest 输出的zip路径\n
ZipHelper.exe -unzip --source 需要解压缩的zip路径 --dest 解压到的输出目录路径
ZipHelper.exe -unzip --source 需要解压缩的zip路径 --insource zip内部路径(如word/document.xml) --dest 解压到的输出目录路径
-
我使用第三方模块
click
库来作为命令行参数解析库, 也是需要通过pip install click
安装的。 -
使用动态语言
python
开发自动化脚本,不考虑性能的情况下还是比C/C++
方便的。当然也可以使用它来代替复杂的shell
脚本.
例子
ZipHelper.py
from zipfile import ZipFile
import click
import zipfile
import os
@click.command(help="""压缩和解压ZIP文件,默认是压缩,请是使用--help查看帮助\n
ZipHelper --source 需要压缩的目录路径 --dest 输出的zip路径\n
ZipHelper -unzip --source 需要解压缩的zip路径 --dest 解压到的输出目录路径""")
@click.option('-unzip',is_flag=True, help="解压")
@click.option('--source',default="",help="zip内文件")
@click.option('--insource',default="",help="zip内文件")
@click.option('--dest',default="",help="zip内文件")
@click.pass_context
def runZipOrUnzip(ctx,unzip,source,insource,dest):
print(" \n unzip: %s\n source: %s\n insource: %s\n dest %s\n"
% (unzip,source,insource,dest))
if(len(source) == 0 or len(dest) == 0):
return
if(unzip):
with ZipFile(source) as f:
if(len(insource) == 0):
f.extractall(path = dest)
else:
f.extract(path = dest,member =insource)
else:
with ZipFile(dest,'w',zipfile.ZIP_DEFLATED) as z:
for dirpath, dirnames, filenames in os.walk(source):
fpath = dirpath.replace(source,'')
fpath = fpath and fpath + os.sep # + 优先级 > and
for filename in filenames:
z.write(os.path.join(dirpath, filename),fpath+filename)
print ('==压缩成功==')
pass
pass
if __name__ == "__main__":
print("Hello ZipHelper!")
runZipOrUnzip(obj = {})
print("Done ZipHelper!")
pass
下载
ZipHelper.exe
放在AutomaticPython项目里, 可以下载Windows
版本的压缩包.