Python遞歸解壓縮多級.zip壓縮包


參考如下代碼(from:https://stackoverflow.com/questions/36285502/how-to-extract-zip-file-recursively-in-python):

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] 文件名或擴展名太長。

 

如何您也在此處遇到問題,歡迎一起參與討論,如果您能夠解決我的問題,賜教!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM