手里有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