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

刘早起 2020-11-16 16:19:41
Python 自动 解压 后台 在后


一、需求描述

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

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

二、步骤分析和前置知识

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

  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结尾,并进行相应处理

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

三、代码实现

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

处理.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文件的函数写出来?

处理.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()

处理.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()

处理.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)

实现实时检测

比较简单的方法就是建立 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)

-END-

本文分享自微信公众号 - 早起Python(zaoqi-python) ,作者:陈熹

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间: 2020-11-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[刘早起]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1748306

  1. 利用Python爬虫获取招聘网站职位信息
  2. Using Python crawler to obtain job information of recruitment website
  3. Several highly rated Python libraries arrow, jsonpath, psutil and tenacity are recommended
  4. Python装饰器
  5. Python实现LDAP认证
  6. Python decorator
  7. Implementing LDAP authentication with Python
  8. Vscode configures Python development environment!
  9. In Python, how dare you say you can't log module? ️
  10. 我收藏的有关Python的电子书和资料
  11. python 中 lambda的一些tips
  12. python中字典的一些tips
  13. python 用生成器生成斐波那契数列
  14. python脚本转pyc踩了个坑。。。
  15. My collection of e-books and materials about Python
  16. Some tips of lambda in Python
  17. Some tips of dictionary in Python
  18. Using Python generator to generate Fibonacci sequence
  19. The conversion of Python script to PyC stepped on a pit...
  20. Python游戏开发,pygame模块,Python实现扫雷小游戏
  21. Python game development, pyGame module, python implementation of minesweeping games
  22. Python实用工具,email模块,Python实现邮件远程控制自己电脑
  23. Python utility, email module, python realizes mail remote control of its own computer
  24. 毫无头绪的自学Python,你可能连门槛都摸不到!【最佳学习路线】
  25. Python读取二进制文件代码方法解析
  26. Python字典的实现原理
  27. Without a clue, you may not even touch the threshold【 Best learning route]
  28. Parsing method of Python reading binary file code
  29. Implementation principle of Python dictionary
  30. You must know the function of pandas to parse JSON data - JSON_ normalize()
  31. Python实用案例,私人定制,Python自动化生成爱豆专属2021日历
  32. Python practical case, private customization, python automatic generation of Adu exclusive 2021 calendar
  33. 《Python实例》震惊了,用Python这么简单实现了聊天系统的脏话,广告检测
  34. "Python instance" was shocked and realized the dirty words and advertisement detection of the chat system in Python
  35. Convolutional neural network processing sequence for Python deep learning
  36. Python data structure and algorithm (1) -- enum type enum
  37. 超全大厂算法岗百问百答(推荐系统/机器学习/深度学习/C++/Spark/python)
  38. 【Python进阶】你真的明白NumPy中的ndarray吗?
  39. All questions and answers for algorithm posts of super large factories (recommended system / machine learning / deep learning / C + + / spark / Python)
  40. [advanced Python] do you really understand ndarray in numpy?
  41. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行
  42. [advanced Python] Python advanced column main readme: never forget the original intention and forge ahead
  43. python垃圾回收和缓存管理
  44. java调用Python程序
  45. java调用Python程序
  46. Python常用函数有哪些?Python基础入门课程
  47. Python garbage collection and cache management
  48. Java calling Python program
  49. Java calling Python program
  50. What functions are commonly used in Python? Introduction to Python Basics
  51. Python basic knowledge
  52. Anaconda5.2 安装 Python 库(MySQLdb)的方法
  53. Python实现对脑电数据情绪分析
  54. Anaconda 5.2 method of installing Python Library (mysqldb)
  55. Python implements emotion analysis of EEG data
  56. Master some advanced usage of Python in 30 seconds, which makes others envy it
  57. python爬取百度图片并对图片做一系列处理
  58. Python crawls Baidu pictures and does a series of processing on them
  59. python链接mysql数据库
  60. Python link MySQL database