用python进行批量文件的解压缩/压缩批量文件

2022-05-20 10:07:03

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)

测试结果是可行的。

  • 作者:机器猫的世界
  • 原文链接:https://blog.csdn.net/machinecat5888/article/details/104868345
    更新时间:2022-05-20 10:07:03