用python进行批量文件的解压缩/压缩批量文件
7z的命令行参数
python可以通过subprocess模块的相关函数运行外部程序,完成一些操作。如本文要介绍的python脚本通过7z程序来实现批量解压缩文件或批量压缩文件。首先介绍7z的相关命令行参数。
其中7z的命令行参数参考自:https://blog.csdn.net/oilcode/article/details/50063425
7z压缩文件的命令行参数
用命令行来执行7z的极限压缩,就是如下的命令:
H:\Program Files\7-Zip\7z.exe a -t7z newPack.7z “H:\testDoc*” -r -mx=9 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on
其中,
1,H:\Program Files\7-Zip\7z.exe
这个是7z可执行文件的完整路径。
注意:这里必须是7z.exe的完整路径,在我的win10环境下测试,如果不是完整路径,即使在环境变量里注册了该程序,也是不行的。
2,a
表示add命令,即新建一个压缩文件,该压缩文件存放在当前目录下
3,-t7z
这个表示使用的压缩类型是7z。类似的还有 -tzip 等等。
4,newPack.7z
加粗样式新建的压缩文件的名字。
5,"H:\testDoc*"
表示把该目录下的所有的文件都执行压缩操作,添加到压缩文件中。
6,-r
表示遍历所有的子目录,每个文件都执行压缩操作,添加到压缩文件中。
7,-mx=9
表示压缩等级,9级是最高等级。默认等级是5。
8,-m0=LZMA2
表示优先使用 LZMA2 算法。类似的,还可以设置第二优先 -m1=LZMA ,第三优先 -m2=BZip2 。
9,-ms=10m
表示开启固实模式,这种模式是把压缩包中的所有文件都当成一个连续数据流来看待。通常情况下,固实压缩可增加压缩比,特别是在添加大量小文件的时候。
这里除了开启固实模式,还设置了以10兆作为一个数据块。
10,-mf=on
表示开启可执行文件压缩过滤器。
11,-mhc=on
表示对压缩包的文件头也进行压缩。
12,-mmt=on
表示开启多线程,提高压缩速度。
7z解压文件的命令行参数
解压缩的命令如下:
H:\Program Files\7-Zip\7z.exe x newPack.zip -oH:\Doc -aoa
其中,
1,** H:\Program Files\7-Zip\7z.exe**
这个是7z可执行文件的完整路径
注意:这里必须是7z.exe的完整路径,在我的win10环境下测试,如果不是完整路径,即使在环境变量里注册了该程序,也是不行的。
2,x
表示解压缩,并且使得压缩包内的文件所在的目录结构保持不变。如果你希望解压缩后所有的文件都存放在同一个目录下,则使用 e 这个命令。
3,newPack.zip
表示压缩包的文件名。该压缩包是存放在当前目录下的。
4,-oH:\Doc
表示把压缩包内的文件解压缩到 c:\Doc 目录下。-o 这个参数用于指定输出目录。
5,-aoa
表示直接覆盖现有文件,而没有任何提示。类似的参数还有:
-aos 跳过现有文件,其不会被覆盖。
-aou 如果相同文件名的文件以存在,将自动重命名被释放的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
-aot 如果相同文件名的文件以存在,将自动重命名现有的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
程序实例
下面的程序演示了批量解压某个文件夹下的[.rar,.zip,.7z]等类型的压缩文件。
import subprocess#===========================================================================defIsHaveSubString(SubStrList,Str):"""
#判断字符串Str是否包含序列SubStrList中的一个子字符串
#>>>SubStrList=['zip','rar','7z']
#>>>Str='F06925EMS91.zip'
#>>>IsSubString(SubStrList,Str)#return True (or False)
"""
flag=Falsefor subStrin SubStrList:if subStrin Str:
flag=Truebreakreturn flag#===========================================================================defGetFileListByType(dirPath,fileFlag=[]):'''
在dirPath目录下,获取fileFlag指定类型的所有文件,只检查dirPath,不递归检查其子目录
:param dirPath: 目录路径
:param fileFlag: 文件类型列表,指文件的后缀名,例如:[".c",".cpp"]
:return: fileList
'''import os
fileList=[]
fileNames=os.listdir(dirPath)if(len(fileNames)>0):for fnin fileNames:if(len(fileFlag)>0):#返回指定类型的文件名if(IsHaveSubString(fileFlag,fn)):#fullfilename=os.path.join(FindPath,fn)
fileList.append(fn)else:#默认直接返回所有文件名#fullfilename=os.path.join(FindPath,fn)
fileList.append(fn)#对文件名排序if(len(fileList)>0):
fileList.sort()return fileList#===========================================================================defUnzipFiles(program7zPath, filePath, fileFlag=[".7z",".rar",".zip"]):'''
解压filePath路径下的指定类型的所有压缩文件,解压文件保存在bakUnzip子文件夹内
:param program7zPath: 解压缩程序的完整路径,不能依赖于环境变量(在win10下测试是无效的)
:param filePath: 压缩文件路径
:param fileFlag: 压缩文件类型,
:return: False---没有解压任何文件,True---解压了文件
'''#------获取文件类型为fileFlag中的所有文件-------
orgFileList=cf.GetFileListByType(filePath, fileFlag)# 依次获取所有后缀名的文件#print(len(orgFileList))#------如果没有任何文件,则直接返回---------iflen(orgFileList)==0:print("没有发现任何指定的压缩文件!")returnFalse#-------创建保存解压缩文件的子文件夹--------
isOk=cf.mkOneDir(filePath,"bakUnzip")ifnot isOk:print("创建bakUnzip文件夹失败")returnFalse
targetFilePath=filePath+"\\bakUnzip"# ----创建两个文件--------
successFile=open(targetFilePath+"\\UnzipSuccess.txt","w")
failFile=open(targetFilePath+"\\UnzipFail.txt","w")#--------批量解压文件-----------for fin orgFileList:#这里必须是7z.exe的完成路径#cmdStr="H:\\Program Files\\7-Zip\\7z.exe x "+filePath+"\\"+f+" -o"+targetFilePath #这里-o后面不能有空格
index=f.rfind(".")
fstr=f[:index]
cmdStr= program7zPath+" x "+ filePath+"\\"+ f+" -o"+ targetFilePath+"\\"+fstr# 这里-o后面不能有空格
recode=0# 默认返回值为0,表示编译通过try:
recode= subprocess.check_output(cmdStr)
ricode=int.from_bytes(recode, byteorder='big', signed=False)if ricode<0:print("Compile Fail: ", f)
failFile.write(f+"\n")else:print("Compile success:", f)
successFile.write(f+"\n")except subprocess.CalledProcessError:print("Compile Fail: ", f)
failFile.write(f+"\n")# ----关闭两个文件--------
successFile.close()
failFile.close()returnTrue#===========================================================================if __name__=="__main__":
filePath="H:\\2019HW"
program7zPath="H:\\Program Files\\7-Zip\\7z.exe"
isOk=UnzipFiles(program7zPath, filePath)print(isOk)
测试结果是可行的。