一、需求描述编写一个Python程序。每次下载压缩包形式的文件时,会自动将内部文件解压到当前文件夹,并删除压缩包。通过本案例可以学到的知识点:os模块综合应用glob模块综合应用利用gzipzipfilerarfiletarfile模块解压文件2.步骤分析及预知代码代码前,复杂的问题需要解释成多个明确需求,即本程序实现的逻辑是:定时检测某个文件夹(如download文件夹)是否有压缩文件。如果有新的压缩文件,将其解压到当前文件夹中的新文件夹中。删除压缩文件。说到压缩文件,我们会用不同的压缩格式来讨论。主要有以下四种:gz:即gzip,通常只能压缩一个文件tar:本质上不是压缩工具,而是打包工具,可以与.gz组合成.tar的打包压缩格式.gzzip:类似.tar.gz但可以打包压缩Multiplefilesrar:打包压缩文件,最初用于DOS所以判断一个文件是否为压缩文件的逻辑可以如下:创建一个listwithcompressedpackagesuffixcompressed_lst=['gz','tar','zip','rar']对目标文件夹下的所有文件名运行filename.split(.)[-1]获取后缀,判断后缀是否在compressed_lst中,如果存在则运行后续解压代码如果文件以gz结尾,则解压之后需要再次判断是否以.tar结尾,并进行相应处理。不同压缩文件的解压代码不同,在后续的代码操作中会展开。3、代码实现是先获取下载文件夹下所有文件的文件名importglobimportospath=r'C:\xxxx\download'file_lst=glob.glob(path+'/*')#列表理解小路。basename(i)foriinfile_lst]print(filename_lst)接下来根据文件后缀名判断是否需要压缩,先看代码框架foriinfilename_lst:if'.'ini:#获取后缀名suffix=i.split('.')[-1]#将每个格式的后缀名和压缩后的后缀一一匹配ifsuffix=='gz':passif...:#再次检查新生成的文件名是否以.tar结尾passifsuffix=='tar':passifsuffix=='zip':passifsuffix=='rar':pass这里有2点需要注意:一些文件不要后缀名,所以它可能不存在。此时使用filename.split('.')[-1]会报错,所以需要先判断以.gz结尾的文件,解压后需要再次判断是否以.tar结尾。然后我们就可以把四种压缩文件的解压代码写成函数,满足要求的时候分别调用。.gzgz_fileafterfilename=gzip.GzipFile(filename)withopen(filename,"w+")asfile:file.write(gz_file.read())returnfilename#这个gzip函数需要返回一个值,进一步配合多次提到的untar函数之前的gz文件可能会和tar文件配合,所以解压gz文件后需要判断是否需要解压tar文件。这里可以先把tar文件的函数写出来#128071;2。处理.tar文件importtarfiledefuntar(filename):tar=tarfile.open(filename)names=tar.getnames()#tar本身打包文件,解包会生成很多文件,所以需要新建一个文件夹存放ifnotos.path.isdir(文件名+"_dir"):os.mkdir(文件名+"_dir")fornameinnames:tar.extract(name,filename+"_dir/")tar.close()3.处理.zip文件importzipfiledefunzip(filename):zip_file=zipfile.ZipFile(filename)#类似于tarrelease打包并创建文件夹存放解压后的文件ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")fornamesinzip_file.namelist():zip_file.extract(names,filename+"_dir/")zip_file.close()4.处理.rar文件importrarfiledefunrar(filename):rar=rarfile.RarFile(filename)ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")os.chdir(filename+"_dir")rar.extractall()rar.close()可以看到,四解压代码略有不同,建议大家在实际演示中体验差异,解压后可以通过os.remove()删除压缩包,现在看一下添加解压函数后的逻辑框架内容:forfilenameinfilename_lst:if'.'infilename:suffix=filename.split('.')[-1]ifsuffix=='gz':new_filename=ungz(filename)os.remove(filename)ifnew_filename.split('.')[-1]=='tar':untar(new_filename)os.remove(new_filename)ifsuffix=='tar':untar(filename)os.remove(filename)ifsuffix=='zip':unzip(filename)os.remove(filename)ifsuffix=='rar':unrar(filename)os.remove(filename)5、实现实时检测比较简单的方法是建立一个whileTrue无限循环,配合time.sleep()休眠,框架如下:importtimewhileTrue:func()time.sleep(5)#sleep秒数可以设置大一些,避免过度占用资源,最后将第二步的实现代码改成一个函数,放到循环帧中完成这个需求,完整代码如下:importglobimportosimportgzipimporttarfileimportzipfileimportrarfileimporttimepath=r'C:\xxxx\download'file_lst=glob.glob(path+'/*')filename_lst=[os.path.basename(i)foriinfile_lst]defungz(filename):filenamefilename=filename[:-3]gz_file=gzip.GzipFile(文件名)withopen(文件名,"w+")asfile:file.write(gz_file.read())returnfilenamedefuntar(文件名):tar=tarfile.open(文件名)names=tar.getnames()ifnotos.path.isdir(文件名+“_dir”):os.mkdir(文件名+“_dir”)fornameinnames:tar.extract(名称,文件名+“_dir/”)tar.close()defunzip(文件名):zip_file=zipfile.ZipFile(文件名)ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")fornamesinzip_file.namelist():zip_file.extract(names,filename+"_dir/")zip_file.close()defunrar(文件名):rar=rarfile.RarFile(文件名)ifnotos.path.isdir(文件名+"_dir"):os.mkdir(文件名+"_dir")os.chdir(文件名+"_dir")rar.extractall()rar.close()defunzip_files():forfilenameinfilename_lst:if'.'infilename:suffix=filename.split('.')[-1]ifsuffix=='gz':new_filename=ungz(filename)os.remove(filename)ifnew_filename.split('.')[-1]=='tar':untar(new_filename)os.remove(new_filename)ifsuffix=='tar':untar(filename)os.remove(filename)ifsuffix=='zip':unzip(文件名)os.remove(文件名)ifsuffix=='rar':unrar(文件名)os.remove(文件名)whileTrue:unzip_files()time.sleep(5)
