2022年 11月 3日

python-7z压缩批量解压缩

手里有100多个压缩文件,文件名就是解压密码,一个个弄太麻烦了,所以今天就研究研究解压缩,没有小一点的7Z文件,先学压缩吧(度娘给的是简书:关爱单身狗成长协会的代码)

1.首先需要一个7z独立运行包。

在这里插入图片描述

2.解压缩到一个目录下,在系统变量path中添加路径

3.知识点

3.1压缩

C:\7za a -t7z D:\C\file.7z -ppassword D:\C\*  -r -x!*.log -x!*.md -x!*.tmp -xr!*.vscode -xr!*node_modules -x!app/* -x!log/* -x!runtime/session/* -x!runtime/config/*  -mx=5 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on
  • 1

参数说明:

a:这个表示add命令,即新建一个压缩文件,该压缩文件存放在当前目录下。还有其他的命令,例如解压缩,从压缩文件中删除一个文件,等等
-t7z:这个表示使用的压缩类型是7z。类似的还有 -tzip 等等。
D:\C\file.7z:新建的压缩文件。
D:\C*:这个表示把该目录下的所有的文件都执行压缩操作,添加到压缩文件中
-r:这个参数表示遍历所有的子目录,每个文件都执行压缩操作,添加到压缩文件中。
-mx=9:这个参数表示压缩等级,9级是最高等级。默认等级是5
-m0=LZMA2:这个参数表示优先使用 LZMA2 算法。类似的,还可以设置第二优先 -m1=LZMA ,第三优先 -m2=BZip2
-ms=10m:这个参数表示开启固实模式,这种模式是把压缩包中的所有文件都当成一个连续数据流来看待。通常情况下,固实压缩可增加压缩比,特别是在添加大量小文件的时候。这里除了开启固实模式,还设置了以10兆作为一个数据块
-mf=on:这个参数表示开启可执行文件压缩过滤器。
-mhc=on:这个参数表示对压缩包的文件头也进行压缩
-mmt=on:这个参数表示开启多线程,提高压缩速度
-x!:排除路径或文件
-xr!:排除文件夹

代码:

import os
  
#需要备份起始文件夹
source_dir="D:\\C"
#备份保存到
save_dir = 'D:\\C'
# 排除的指定文件夹
ignore_folder=['.vscode','node_modules']
# 排除的任意指定文件
ignore_files=['*.log','*.md','*.tmp'] 
# 排除指定路径下的文件(会保留相应路径下的文件夹)
ignore_path_files=['app/*','log/*','runtime/session/*','runtime/config/*']

ignore_str=''
for i in ignore_files:
    ignore_str=ignore_str+'-x!'+i+' '

for i in ignore_folder:
    ignore_str=ignore_str+'-xr!*'+i+' '

for i in ignore_path_files:
    ignore_str=ignore_str+'-x!'+i+' '
    
#  ============================= 将文件压缩 ===============
 
# 获取备份的文件夹名称
dname=os.path.dirname(source_dir).split(os.sep)[-1]
# 拼接文件名
fname ='file.7z'
# 拼接保存文件路径
target = save_dir + os.sep +fname
# 拼接命令,ignore_str是被排除的文件后缀列表
cmd=os.getcwd()+"\\7za a -t7z %s -p%s %s%s*  -r %s -mx=5 -m0=LZMA2 -ms=10m -mf=on -mhc=on -mmt=on"%(target,"password",source_dir,os.sep,ignore_str)
print(cmd)
# 执行压缩
os.system(cmd ) 
print(source_dir,'=====>',target)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

3.2 解压缩

C:\7za.exe x D:\C\files.7z -oD:\C\ -aoa
  • 1

参数说明:

x:这个表示解压缩,并且使得压缩包内的文件所在的目录结构保持不变。如果你希望解压缩后所有的文件都存放在同一个目录下,则使用 e 这个命令。
**D:\C**:需要解压缩文件的路径。
-o:这个表示把压缩包内的文件解压缩到 E:\Application\ 目录下。-o 这个参数用于指定输出目录。
-aoa:这个表示直接覆盖现有文件,而没有任何提示。类似的参数还有:
-aos :跳过现有文件,其不会被覆盖。
-aou :如果相同文件名的文件以存在,将自动重命名被释放的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
-aot :如果相同文件名的文件以存在,将自动重命名现有的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。

代码:

import os

# 压缩包来源目录
source='D:\\C'
# 解压到
target_dir='D:\\C'

files = os.listdir( source )
for f in files:
	f_path=source+os.sep+f
	if os.path.isfile(f_path):
		exn=f.split(".")[-1]
		if exn=="7z":
			d_name=f.split(".")[0]
			target = target_dir + os.sep +d_name
			#print(f_path,"===>",target)
			# 解压命令(密码为文件名所以是d_name)
			cmd="7za.exe x %s -p%s -o%s -aoa"%(f_path,d_name,target)
			print(cmd)
			#文件解压是否失败情况写入文本文档。
			f = "D:\\C\\error.txt"
			with open(f,"a") as file:
			    #os.system(cmd)命令执行成功时返回0
			    if os.system(cmd) == 0:
			        file.write(d_name + "-success" +"\n")
			    else:
			        file.write(d_name + "-error" +"\n")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27