背景
在windows平台,从某网站上通过批量下载很多(数百个)的压缩文件,需要提前压缩包里面的文件。
分析
在linux下可以很方便的使用shell来完成
当然在windows下也可以通过批处理完成,奈何不熟悉批处理语法
还是选择熟悉的python来完成吧
总体思路
- 获取压缩包目录下的所有压缩文件
- 循环执行解压命令
技术细节
python读取文件
程序说明见注释,需要传入文件路径以及压缩文件的后缀,后缀可以为空,为空则返回所有文件
实现以来os模块的listdir接口
获取到所有文件接口之后,判断是否为传入的后缀文件,传入则保存
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 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
调用windows进程
调用mkdir来创建一个保存解压后文件的路径
def mkOneDir(path, subpath):
'''
在path目录下创建subpath
:param path: 在path目录下创建
:param subpath: 创建的子目录
:return:
'''
cmdStr = 'mkdir '+path+"\\"+ subpath
try:
import os
recode =os.system(cmdStr)
return True
except Exception as e:
print(e)
return False
调用文件接口,保存解压成功和失败的文件清单
# ----创建两个文件--------
循环遍历所有符合条件的文件,进行解压
for f
这里可以自定义解压的程序,如可以使用7zip或者rar以及其他
解压的参数可以根据解压的程序自行构建,这里使用7zip来解压,构建的命令如下
cmdStr = program7zPath + " e " + filePath + "\" + f + " -o" + targetFilePath + " -y"
具体的参数可以参考7zip的官方解释
解压成功之后,记录成功文件,然后执行下一个文件
程序入口
在开始调用程序前,需要指定待解压的文件目录,解压的程序
if __name__==
总结
如果是linux下,通过shell一条命令即可解决。但是windows下不熟悉bat脚本,还是使用常见的python来完成吧。这里提供了一种思路,供参考。
选择不同的解压程序,构建的解压命令是不一样的,是单独释放到一个新的文件夹还是在释放到当前文件目录,可以根据解压程序来设置。
如果想要完整代码,请私信。