python递归解压文件_Python递归解压缩多级.zip压缩包

import os

import io

import zipfile

def extract(filename):

z = zipfile.ZipFile(filename)

for f in z.namelist():

# get directory name from file

dirname = os.path.splitext(f)[0]

# create new directory

os.mkdir(dirname)

# read inner zip file into bytes buffer

content = io.BytesIO(z.read(f))

zip_file = zipfile.ZipFile(content)

for i in zip_file.namelist():

zip_file.extract(i, dirname)

封装到class

import os

import shutil

from BetaLogAnalysis.settings import ZIP_FILES_DIR, EXTRACT_DIR

class ExtractArchive(object):

""" 递归解压缩.zip文件"""

def __init__(self, zip_file_dir, extract_dir):

"""

@zip_file_dir: .zip格式的压缩包文件所在目录

@extract_dir: name.zip文件将被提取到extract/name

"""

self.zip_file_dir = zip_file_dir

self.extract_dir = extract_dir

def run(self):

for root, dirs, files in os.walk(self.zip_file_dir):

for filename in files:

if filename.endswith(".zip"):

# 创建跟压缩包同名的文件夹

os.mkdir(os.path.join(self.extract_dir, filename[:-4]))

zip_file = os.path.join(self.zip_file_dir, filename)

to_folder = os.path.join(self.extract_dir, filename[:-4])

self.extract_zip(zip_file, to_folder)

def extract_zip(self, zip_file, to_folder):

""" 递归地提取格式为.zip的压缩包内的所有文件并在提

取后将原文件删除

@zip_file: .zip格式的压缩包文件

@to_folder: 将文件提取到此处

"""

# 解压

shutil.unpack_archive(zip_file, to_folder)

# 将原文件删除

os.remove(zip_file)

# 遍历 to_folder

for root, dirs, files in os.walk(to_folder):

for filename in files:

if filename.endswith(".zip"):

os.mkdir(os.path.join(to_folder, filename[:-4]))

to_folder = os.path.join(to_folder, filename[:-4])

zip_file = os.path.join(root, filename)

self.extract_zip(zip_file, to_folder)

if __name__ == '__main__':

e = ExtractArchive(ZIP_FILES_DIR, EXTRACT_DIR)

e.run()

尚存在的问题:

中文乱码

名字过长报错: FileNotFoundError: [WinError 206] 文件名或扩展名太长。

如何您也在此处遇到问题,欢迎一起参与讨论,如果您能够解决我的问题,赐教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值