參考如下代碼(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] 文件名或擴展名太長。
如何您也在此處遇到問題,歡迎一起參與討論,如果您能夠解決我的問題,賜教!
