Python で zip ファイルから特定のフォルダーを抽出し、元のファイル名の後に名前を変更したいと思います。
たとえば、test.zip
いくつかのフォルダーとサブフォルダーを含むというファイルがあります。
xl/media/image1.png
xl/drawings/stuff.png
stuff/otherstuff.png
メディア フォルダーのコンテンツを test というフォルダーに抽出します。
test/image1.png
使用する
zipfile
モジュール、特にZipFile.extractall()
os.path.splitext()
test1
文字列
から取得するtest1.zip
tmpfile.mkdtemp()
一時ディレクトリを作成するにはshutil.move()
ディレクトリツリー全体を移動します。例えば:
#!/usr/bin/env python
"""Usage:
./extract.py test.zip
"""
from zipfile import ZipFile
import os
import sys
import tempfile
import shutil
ROOT_PATH = 'xl/media/'
zip_name = sys.argv[1]
zip_path = os.path.abspath(zip_name)
extraction_dir = os.path.join(os.getcwd(), os.path.splitext(zip_name)[0])
temp_dir = tempfile.mkdtemp()
with ZipFile(zip_path, 'r') as zip_file:
# Build a list of only the members below ROOT_PATH
members = zip_file.namelist()
members_to_extract = [m for m in members if m.startswith(ROOT_PATH)]
# Extract only those members to the temp directory
zip_file.extractall(temp_dir, members_to_extract)
# Move the extracted ROOT_PATH directory to its final location
shutil.move(os.path.join(temp_dir, ROOT_PATH), extraction_dir)
# Uncomment if you want to delete the original zip file
# os.remove(zip_path)
print "Sucessfully extracted '%s' to '%s'" % (zip_path, extraction_dir)
ブロックを使用try..except
して、ディレクトリの作成、ファイルの削除、zip の解凍時に発生するさまざまな例外に対処します。