如何进行递归的对压缩文件进行解压
在使用zipfile库解压压缩文件的时候,有时候会遇到一种情况,就是一个压缩文件里面还有压缩文件,所以我们需要一层一层的进入目录下面进行解压。本文提到的就是对压缩文件进行递归的解压。
这里举例的是解压缩zip格式的压缩文件,所以下面的代码只能用于解压zip格式的压缩文件,但是其他压缩类型的文件可以以此类推。
在这里面需要学会几个函数的使用:
- zipfile.ZipFile():传入文件路径,获取压缩文件内的信息
- zipfile.namelist():获取该目录下的文件夹名和文件名
- zipfile.extract():解压文件到指定目录,包括文件夹
- str.endswith():匹配文件后缀
- list_dir():列出指定路径下的文件夹名和文件名
以下代码为递归解压缩的代码:
import shutil
import zipfile
import os
# 简洁版,仅用于递归的方式解压文件
def recursive_unzip(path, zfile):
"""解压缩文件"""
# file_path用于解压缩文件;des_dir用于存放下一级的解压缩的同名目录
file_path = os.path.join(path, zfile)
des_dir = os.path.join(path, zfile[:-4])
srcfile = zipfile.ZipFile(file_path) # 获取解压文件信息
for file_name in srcfile.namelist(): # 获取解压文件下的目录
srcfile.extract(file_name, des_dir) # 将zip文档内的指定文件解压到当前目录
print("解压文件名称:",file_name)
if file_name.endswith('.zip'): # 如果是压缩文件,则进入下一级解压
path = des_dir
zfile = file_name
recursive_unzip(path, zfile)
if __name__ == '__main__':
# 文件路径 及 该路径下的压缩文件
path = r'../发票样例/'
zfiles = [file for file in os.listdir(path) if file[-3:] == 'zip']
for file in zfiles:
recursive_unzip(path, file)
# 复杂版,解压文件后自动删除源文件
recursive_unzip_file = []
def recursive_unzip(path, zfile):
# file_path用于解压缩文件;des_dir用于存放下一级的解压缩的同名目录
file_path = os.path.join(path, zfile)
des_dir = path + zfile[:zfile.index('.zip')]
srcfile = zipfile.ZipFile(file_path)
for file_name in srcfile.namelist():
# 如果里面的文件是压缩文件,就递归的进入下一层目录
if file_name.endswith('.zip'):
temp_del_file = os.path.join(des_dir, file_name)
if temp_del_file not in recursive_unzip_file:
recursive_unzip_file.append(temp_del_file)
srcfile.extract(file_name, des_dir) # 将zip文档内的指定文件解压到当前目录
print("解压文件名称:",file_name)
if file_name.endswith('.zip'):
temp_del_file = os.path.join(des_dir, zfile)
if temp_del_file not in recursive_unzip_file:
recursive_unzip_file.append(temp_del_file)
path = des_dir
zfile = file_name
recursive_unzip(path, zfile)
def del_file(file_path):
"""
删除指定路径下的所有文件和文件夹
:param file_path: 路径
:return:
"""
for del_file_path in file_path:
if os.path.isfile(del_file_path):
os.remove(del_file_path)
elif os.path.isdir(del_file_path):
shutil.rmtree(del_file_path)
if __name__ == '__main__':
# 文件路径 及 该路径下的压缩文件
path = r'../发票样例/'
zfiles = [file for file in os.listdir(path) if file[-3:] == 'zip']
recursive_unzip_file = [path+file for file in zfiles]
print(recursive_unzip_file)
for file in zfiles:
recursive_unzip(path, file)
del_file(recursive_unzip_file)
网友评论