用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

#===========================================================================
def IsHaveSubString(SubStrList,Str):
    """
    #判断字符串Str是否包含序列SubStrList中的一个子字符串
    #>>>SubStrList=['zip','rar','7z']
    #>>>Str='F06925EMS91.zip'
    #>>>IsSubString(SubStrList,Str)#return True (or False)
    """
    flag=False
    for subStr in SubStrList:
        if subStr in Str:
            flag=True
            break
    return flag
#===========================================================================
def GetFileListByType(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 fn in 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

#=========================================================================== 
def UnzipFiles(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))

    #------如果没有任何文件,则直接返回---------
    if len(orgFileList)==0:
        print("没有发现任何指定的压缩文件!")
        return False

    #-------创建保存解压缩文件的子文件夹--------
    isOk=cf.mkOneDir(filePath, "bakUnzip")
    if not isOk:
        print("创建bakUnzip文件夹失败")
        return False

    targetFilePath=filePath+"\\bakUnzip"

    # ----创建两个文件--------
    successFile = open(targetFilePath + "\\UnzipSuccess.txt", "w")
    failFile = open(targetFilePath + "\\UnzipFail.txt", "w")

    #--------批量解压文件-----------
    for f in 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()
    return True
#===========================================================================
if __name__=="__main__":
    filePath="H:\\2019HW"
    program7zPath="H:\\Program Files\\7-Zip\\7z.exe"
    isOk=UnzipFiles(program7zPath, filePath)
    print(isOk)

测试结果是可行的。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用Python批量解压缩文件并输入密码,可以使用zipfile和rarfile库来实现。首先,你需要判断文件是否有密码。你可以使用以下代码来判断zip文件是否有密码: ```python import zipfile def check_zip_password(path): fileGet = zipfile.ZipFile(path) with fileGet as z: for l in z.infolist(): is_encrypted = l.flag_bits & 0x1 if is_encrypted: print("该文件有密码") break else: print("该文件没有密码") ``` 如果你需要批量解压缩zip文件并输入密码,可以使用以下代码: ```python import zipfile def extract_zip_with_password(zip_file, password): with zipfile.ZipFile(zip_file) as z: z.extractall(pwd=password) ``` 对于rar文件,你可以使用以下代码来判断是否有密码: ```python import rarfile def check_rar_password(path): fileGet = rarfile.RarFile(path) with fileGet as z: if z.needs_password(): print("该文件有密码") else: print("该文件没有密码") ``` 如果你需要批量解压缩rar文件并输入密码,可以使用以下代码: ```python import rarfile def extract_rar_with_password(rar_file, password): with rarfile.RarFile(rar_file) as z: z.extractall(pwd=password) ``` 希望这些代码能帮到你。如果你有任何其他问题,请随时提问。 #### 引用[.reference_title] - *1* [用python压缩文件并设置密码](https://blog.csdn.net/zzt0605/article/details/118851821)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python解压缩包密码](https://blog.csdn.net/C_gyl/article/details/89407824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python自动化,破解zip密码,提取密码,自动解压](https://blog.csdn.net/FLIPPEDMK/article/details/126037143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值