Python在后台自动解压各种压缩文件的实现方法


Posted in Python onNovember 10, 2020

1.需求描述

编写一个 Python 程序,每次下载压缩包形式的文件后,自动将内部文件解压到当前文件夹后将压缩包删除,通过本案例可以学到的知识点:

  • os 模块综合应用
  • glob 模块综合应用
  • 利用 gzip zipfile rarfile tarfile 模块解压文件

2.步骤分析和前置知识

码代码之前需要将复杂问题解释成多个明确的要求,即这个程序实现的逻辑为:

  1. 定时检测某个文件夹(如 download 文件夹)是否存在压缩文件
  2. 如果有新出现的压缩文件则将其解压到当前文件夹内的新文件夹中 删除压缩文件
  3. 提到压缩文件就要分不同压缩格式进行讨论,主要有以下4种:

提到压缩文件就要分不同压缩格式进行讨论,主要有以下4种:

.gz: 即 gzip,通常只能压缩一个文件
.tar: 本质上不是压缩工具而是打包工具,可以跟 .gz 配合形成 .tar.gz 的打包压缩格式 .zip: 和 .tar.gz 很类似但可以打包压缩多个文件
.rar: 打包压缩文件,最初用于 DOS

因此,文件是否为压缩文件的判断逻辑可以如下:

  1. 建立一个含压缩包后缀的列表 compressed_lst = ['gz', 'tar', 'zip', 'rar']
  2. 目标文件夹下的所有文件名运行 filename.split(.)[-1] 获取后缀名
  3. 判断后缀名是否在 compressed_lst 中,如果存在则运行后续的解压代码
  4. 如果是以 gz 结尾的文件,解压后需要再次判断是否是以 .tar 结尾,并进行相应处理

不同压缩文件的解压代码各不相同,在后续代码操作中具体展开。

3.代码实现

首先是获取 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个注意点:

有些文件没有后缀名,因此可能不存在 .,这时用 filename.split('.')[-1]会报错,因此需要先判断
以.gz 结尾的文件,解压后需要再次判断是否是以 .tar 结尾,然后我们就可以分别将四种压缩文件的解压代码写成函数,符合时候单独调用即可
1、处理.gz 文件

import gzip

def ungz(filename):
 filename = 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):
 filename = 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)

到此这篇关于Python在后台自动解压各种压缩文件的实现方法的文章就介绍到这了,更多相关Python自动解压各种压缩文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python根据出生日期获得年龄的方法
Mar 31 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
Python函数的默认参数设计示例详解
Dec 01 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 #Python
pytorch学习教程之自定义数据集
Nov 10 #Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 #Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 #Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 #Python
python request 模块详细介绍
Nov 10 #Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 #Python
You might like
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
详解ES6中的三种异步解决方案
2018/06/28 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
python下载文件记录黑名单的实现代码
2017/10/24 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
飞利浦美国官网:Philips美国
2020/02/28 全球购物
八年级英语教学反思
2014/01/09 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
2014年纪委工作总结
2014/12/05 职场文书
预备党员自我评价范文
2015/03/04 职场文书
图解上海144收音机
2021/04/22 无线电
你真的会用Mysql的explain吗
2022/03/31 MySQL