当前位置: 首页 > 后端技术 > Python

让python在后台自动解压各种压缩文件!

时间:2023-03-26 16:52:06 Python

作者:陈曦公众号:早起Python一、需求描述编写一个Python程序。每次下载压缩包形式的文件时,会自动将内部文件解压到当前文件夹,并删除压缩包。可以从这个案例中学习知识点:os模块综合应用glob模块综合应用gzipzipfilerarfiletarfile模块解压文件2.步骤分析及前置知识:定期检查文件夹中是否有压缩文件(如下载文件夹)。如果有新的压缩文件,会解压到当前文件夹下的新文件夹中。删除压缩文件。说到压缩文件,一定要分成不同的压缩文件。主要有以下4种格式进行讨论:说到压缩文件,我们需要讨论不同的压缩格式,主要有以下4种:".gz:即gzip,通常只能压缩一个文件。tar:本质上不是压缩工具是打包工具,可以和.gz配合成.tar.gz.zip的打包压缩格式:和.tar.gz很像,但是可以打包压缩多个文件.rar:打包压缩文件,原用于DOS”因此,文件是否为压缩文件的判断逻辑可以如下:创建一个压缩包后缀为compressed_lst=['gz','tar','zip','rar']对目标文件夹下的所有文件名运行filename.split(.)[-1]获取后缀名判断后缀名是否在compressed_lst中,如果存在则运行后续解压代码。如果文件以gz结尾,解压后需要再次判断是否以.tar结尾,并进行相应的处理。不同压缩文件的解压代码不同,在后续的代码操作中会展开。3.代码实现首先获取下载文件夹中所有文件的文件名(i)foriinfile_lst]print(filename_lst)接下来根据文件后缀名判断是否需要压缩,先看代码框架foriinfilename_lst:if'.'ini:getthesuffixnamesuffix=i.split('.')[-1]将后缀名和每种格式的压缩后缀一一匹配ifsuffix=='gz':passif...:#再次判断新生成的文件名是否以.tar结尾passifsuffix=='tar':passifsuffix=='zip':passifsuffix=='rar':pass这里需要注意两点:有些文件没有后缀,可能不存在。此时使用filename.split('.')[-1]会报错,所以需要先判断以.gz结尾的文件。解压后需要再次判断是否以.tar结尾,然后我们可以将四个压缩文件的解压代码写成函数,适合时分别调用处理.gz文件。importgzipdefungz(filename):filename=filename[:-3]#解压一个gz文件的单个文件就是去掉filename后面的.gzgz_file=gzip.GzipFile(filename)withopen(filename,"w+")asfile:file.write(gz_file.read())returnfilename#这个gzip函数需要返回一个值才能进一步配合untar函数。上面反复提到的gz文件可以配合tar文件使用。所以,解压gz文件后,需要判断是否需要解压tar文件。这里,可以先写tar文件的功能吗?处理.tar文件importtarfiledefuntar(filename):tar=tarfile.open(filename)names=tar.getnames()tar本身就是打包文件,解包会生成很多文件,所以需要创建一个文件夹来存放如果不是操作系统。path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")fornameinnames:tar.extract(name,filename+"_dir/")tar.close()处理.zip文件importzipfiledefunzip(filename):zip_file=zipfile.ZipFile(filename)类似于tar解压,解压后创建一个文件夹存放多个文件ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")fornamesinzip_file.namelist():zip_file.extract(names,filename+"_dir/")zip_file.close()processing.rarfilesimportrarfiledefunrar(filename):rar=rarfile.RarFile(filename)ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")os.chdir(filename+"_dir")rar.extractall()从rar.close()可以看出四种解压代码略有不同,建议大家在实际演示中体会其中的区别,解压后可以用os.remove()删除压缩包,现在看逻辑框架并添加解压函数Contentafter:forfilenameinfilename_lst:if'.'在文件名中: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)实现实时检测比较简单的方法是用time.sleep()建立一个whileTrue无限循环休眠,框架如下:importtimewhileTrue:func()time.sleep(5)#sleep秒数可以设置的大一点,避免过多的资源消耗最后把第二步的实现代码改成一个函数,放在loopframe.这个需求可以实现,完整代码如下importglobimportosimportgzipimporttarfileimportzipfileimportrarfileimporttimepath=r'C:xxxxdownload'file_lst=glob.glob(path+'/*')filename_lst=[os.path.basename(i)foriinfile_lst]defungz(filename):filename=文件名[:-3]gz_file=gzip.GzipFile(filename)withopen(filename,"w+")asfile:file.write(gz_file.read())returnfilenamedefuntar(filename):tar=tarfile.open(filename)names=tar.getnames()ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")fornameinnames:tar.extract(name,filename+"_dir/")tar.close()defunzip(filename):zip_file=zipfile.ZipFile(filename)ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")fornamesinzip_file.namelist():zip_file.extract(names,filename+"_dir/")zip_file.close()defunrar(filename):rar=rarfile.RarFile(filename)ifnotos.path.isdir(filename+"_dir"):os.mkdir(filename+"_dir")os.chdir(filename+"_dir")rar.extractall()rar.close()defunzip_files():forfilenameinfilename_lst:如果'.'在文件名中: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(文件名)ifsuffix=='rar':unrar(filename)os.remove(filename)whileTrue:unzip_files()time.sleep(5)