摘要
本代码是一个批量解压缩的python代码,为便于使用(不必每次修改代码内容),实现开箱即用的需求,可直接使用bat命令执行。
项目背景
笔者想利用周末时间,进一步提升技术能力,学习一下vue3,学习自然需要资料啦,虽然笔者永远推崇官方文档,但笔者的许多知识都是借助了黑马程序员的资料以及项目学习的,这个也不例外。但是笔者是一个很懒惰的人,怎么可能手动的将这些文件都解压出来嘛?
代码实现
首先获取项目的目的地址并且检验遍历当前文件夹的文件
接着呢也是很常规的便利进行解压
from zipfile import ZipFile
for filename in os.listdir(path):
zipfile = ZipFile(filename,'r')
for item in zipfile.namelist():
zipfile.extract(item, path)
毫无意外的会报错,这里也是十分显然出现了两个问题。
- 代码文件并不是可解压的文件
- 有些压缩文件内是一个文件夹,有些则是一系列散的文件(如下图中的assets和Pinia.md)
跳过代码文件十分的轻松:
if(filename.endswith('.ipynb')):continue
if(filename.endswith('.py')):continue
接着编写对内部进行判断的处理:
这里实现了三个逻辑:
- 如果压缩文件内只有一个同名文件夹,则直接解压缩至当前目录
- 如果压缩文件内只有一个文件夹,则这个文件夹会被解压至目录并将这个文件夹的名字重命名为与压缩文件相同。举个栗子,
day06.zip
文件下只有一个名为06day06
的文件夹,则这个文件夹会被解压缩至当前目录并重命名为day06
。 - 如果压缩文件内不止一个文件,则将其全部解压至目录下与压缩文件同名文件夹下
from zipfile import ZipFile
for filename in os.listdir(path):
if(filename.endswith('.ipynb')):continue
zipfile = ZipFile(filename,'r')
###################################################
# 判断压缩文件内是否只有一个文件夹
flag = False# false表示都在一个文件中
for item in zipfile.namelist():
if not item.startswith(zipfile.namelist()[0]):
flag=True
break
if(flag):# 不在同一个
out_path = os.path.join(path,filename[:-4])
else:
out_path = path
###################################################
'''这个是将内部直接解压到同名文件夹下
if(zipfile.namelist()[0]!=filename[:-4]+'/'):#需要重新创建文件夹
for item in zipfile.namelist():
zipfile.extract(item, os.path.join(path,filename[:-4]))
continue
'''
###################################################
# 实现解压
for item in zipfile.namelist():
zipfile.extract(item, out_path)
###################################################
# 修改文件夹的名字
if(filename[:-4]!=zipfile.namelist()[0][:-1] and not flag):#都在一个文件夹中但是名字不同
os.rename(zipfile.namelist()[0][:-1],filename[:-4])
zipfile.close()
可以看到成功解压完成了
“部署”
将代码放入py文件并写一个txt文件:python ./xxxxxxx.py
将其改名为.bat
之后只要将其放到想解压的文件夹下就可以自动解压文件夹内所有压缩文件啦。
完整代码
import os
path = os.getcwd()
from zipfile import ZipFile
for filename in os.listdir(path):
if(not filename.endswith('.zip')):continue
zipfile = ZipFile(filename,'r')
flag = False# false表示都在一个文件中
for item in zipfile.namelist():
if not item.startswith(zipfile.namelist()[0]):
flag=True
break
if(flag):# 不在同一个
out_path = os.path.join(path,filename[:-4])
else:
out_path = path
'''这个是将内部直接解压到同名文件夹下
if(zipfile.namelist()[0]!=filename[:-4]+'/'):#需要重新创建文件夹
for item in zipfile.namelist():
zipfile.extract(item, os.path.join(path,filename[:-4]))
continue
'''
# print(out_path)
# 实现解压
for item in zipfile.namelist():
zipfile.extract(item, out_path)
if(filename[:-4]!=zipfile.namelist()[0][:-1] and not flag):#都在一个文件夹中但是名字不同
os.rename(zipfile.namelist()[0][:-1],filename[:-4])
zipfile.close()
优化
上述代码呢只能解压zip文件,但是日常中肯定不止这些,像7z,rar很多类型都不支持这样解压。笔者通过直接用python调用了winrar里的可执行文件进行解压成功了,但是相信这肯定不是最优的方式,查阅资料呢也是发现py7zr
库可以很方便的解决,至于逻辑那肯定是差不多的,代码就等用到再改叭😁