一、需求描述
编写一个Python程序,每次下载压缩包形式的文件后,自动将内部文件解压到当前文件夹后将压缩包删除,通过本案例可以学到的知识点:
二、步骤分析和前置知识
码代码之前需要将复杂问题解释成多个明确的要求,即这个程序实现的逻辑为:
提到压缩文件就要分不同压缩格式进行讨论,主要有以下4种:
因此,文件是否为压缩文件的判断逻辑可以如下:
不同压缩文件的解压代码各不相同,在后续代码操作中具体展开。
三、代码实现
首先是获取 download 文件夹下所有文件的文件名
- import glob
- import os
- path = r'C:\xxxx\download'
- file_lst = glob.glob(path + '/*')
- # 列表推导式
- filename_lst = [os.path.basename(i) for i in file_lst]
- print(filename_lst)
接下来根据文件的后缀名判断是否需要压缩,先看一下代码框架
- for i in filename_lst:
- if '.' in i:
- # 获取后缀名
- suffix = i.split('.')[-1]
- # 逐个将后缀名和各格式的压缩后缀匹配
- if suffix == 'gz':
- pass
- if ...: # 再次判断新产生的文件名是否以 .tar 结尾
- pass
- if suffix == 'tar':
- pass
- if suffix == 'zip':
- pass
- if suffix == 'rar':
- pass
这里有2个注意点:
1. 处理.gz 文件
- import gzip
- def ungz(filename):
- filenamefilename = filename[:-3] # gz文件的单文件解压就是去掉 filename 后面的 .gz
- gz_file = gzip.GzipFile(filename)
- with open(filename, "w+") as file:
- file.write(gz_file.read())
- return filename # 这个gzip的函数需要返回值以进一步配合untar函数
前面反复提及的gz文件有可能跟tar文件配合,因此解压gz文件后需要再判断是否有必要解开tar文件
这里就可以先把tar文件的函数写出来👇
2. 处理.tar文件
- import tarfile
- def untar(filename):
- tar = tarfile.open(filename)
- names = tar.getnames()
- # tar本身是将文件打包,解除打包会产生很多文件,因此需要建立文件夹存放
- if not os.path.isdir(filename + "_dir"):
- os.mkdir(filename + "_dir")
- for name in names:
- tar.extract(name, filename + "_dir/")
- tar.close()
3. 处理.zip文件
- import zipfile
- def unzip(filename):
- zip_file = zipfile.ZipFile(filename)
- # 类似tar解除打包,建立文件夹存放解压的多个文件
- if not os.path.isdir(filename + "_dir"):
- os.mkdir(filename + "_dir")
- for names in zip_file.namelist():
- zip_file.extract(names, filename + "_dir/")
- zip_file.close()
4. 处理.rar文件
- import rarfile
- def unrar(filename):
- rar = rarfile.RarFile(filename)
- if not os.path.isdir(filename + "_dir"):
- os.mkdir(filename + "_dir")
- os.chdir(filename + "_dir")
- rar.extractall()
- rar.close()
可以看到,四种解压代码略有不同,推荐大家实际演示中自己体会一下差别,解压后配合 os.remove() 就可以删除压缩包,现在看看逻辑框架补上解压函数后的内容:
- for filename in filename_lst:
- if '.' in filename:
- suffix = filename.split('.')[-1]
- if suffix == 'gz':
- new_filename = ungz(filename)
- os.remove(filename)
- if new_filename.split('.')[-1] == 'tar':
- untar(new_filename)
- os.remove(new_filename)
- if suffix == 'tar':
- untar(filename)
- os.remove(filename)
- if suffix == 'zip':
- unzip(filename)
- os.remove(filename)
- if suffix == 'rar':
- unrar(filename)
- os.remove(filename)
5. 实现实时检测
比较简单的方法就是建立 while True 死循环配合 time.sleep()睡眠,框架如下:
- import time
- while True:
- func()
- time.sleep(5) # 睡眠秒数可以设置大一点避免过度占用资源
最后将第二步的实现代码改为函数并放在循环框架中就可以完成本次需求,完整代码如下:
- import glob
- import os
- import gzip
- import tarfile
- import zipfile
- import rarfile
- import time
- path = r'C:\xxxx\download'
- file_lst = glob.glob(path + '/*')
- filename_lst = [os.path.basename(i) for i in file_lst]
- def ungz(filename):
- filenamefilename = filename[:-3]
- gz_file = gzip.GzipFile(filename)
- with open(filename, "w+") as file:
- file.write(gz_file.read())
- return filename
- def untar(filename):
- tar = tarfile.open(filename)
- names = tar.getnames()
- if not os.path.isdir(filename + "_dir"):
- os.mkdir(filename + "_dir")
- for name in names:
- tar.extract(name, filename + "_dir/")
- tar.close()
- def unzip(filename):
- zip_file = zipfile.ZipFile(filename)
- if not os.path.isdir(filename + "_dir"):
- os.mkdir(filename + "_dir")
- for names in zip_file.namelist():
- zip_file.extract(names, filename + "_dir/")
- zip_file.close()
- def unrar(filename):
- rar = rarfile.RarFile(filename)
- if not os.path.isdir(filename + "_dir"):
- os.mkdir(filename + "_dir")
- os.chdir(filename + "_dir")
- rar.extractall()
- rar.close()
- def unzip_files():
- for filename in filename_lst:
- if '.' in filename:
- suffix = filename.split('.')[-1]
- if suffix == 'gz':
- new_filename = ungz(filename)
- os.remove(filename)
- if new_filename.split('.')[-1] == 'tar':
- untar(new_filename)
- os.remove(new_filename)
- if suffix == 'tar':
- untar(filename)
- os.remove(filename)
- if suffix == 'zip':
- unzip(filename)
- os.remove(filename)
- if suffix == 'rar':
- unrar(filename)
- os.remove(filename)
- while True:
- unzip_files()
- time.sleep(5)