Python Tips

Unzip

zip ファイルをダウンロードする。

In [20]:
# python tutorial 用 sample zip
#URL = "https://www.learnpython.org/static/media.zip"
URL = "https://github.com/YoshihisaNitta/GoogleColab/raw/refs/heads/main/data/tsuda_sample.zip"
ZIPFILE = URL.split("/")[-1]
FOLDER = ZIPFILE.split(".")[0]
In [6]:
# Web サーバからファイルをダウンロードする python の関数を定義する。
import requests
import os

def download_file(url, dest_dir):
    # url からファイル名を取得する
    filename = url.split("/")[-1]
    local_path = os.path.join(dest_dir, filename)
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()  # HTTPエラーチェック

        # ディレクトリが存在しなければ作成する
        os.makedirs(dest_dir, exist_ok=True)

        # 保存する
        with open(local_path, "wb") as file:
            for chunk in response.iter_content(chunk_size=8192):
                file.write(chunk)
    except Exception as e:
        print(f"Error : {e}")
In [13]:
# zip ファイルをダウンロードする。
download_file(URL, "./data")
In [14]:
# download した zip ファイルを確認する。
! ls -l data
total 5328
-rw-r--r-- 1 root root 5454531 Jan 19 00:15 tsuda_sample.zip
In [12]:
! rm -rf data

unzip コマンドを利用して展開する。

In [17]:
! (cd data; unzip {ZIPFILE})
Archive:  tsuda_sample.zip
   creating: tsuda_sample/
  inflating: tsuda_sample/IMG_0543.JPG  
  inflating: tsuda_sample/IMG_0535.JPG  
In [19]:
! ls -lR data
data:
total 5332
drwxrwxrwx 2 root root    4096 Jan 19 00:03 tsuda_sample
-rw-r--r-- 1 root root 5454531 Jan 19 00:15 tsuda_sample.zip

data/tsuda_sample:
total 5356
-rw-rw-rw- 1 root root 2777440 Jun  7  2021 IMG_0535.JPG
-rw-rw-rw- 1 root root 2702063 Jun  7  2021 IMG_0543.JPG
In [21]:
# 次の実験のため、展開したファイルを消去しておく。
! (cd data; rm -rf {FOLDER})
In [22]:
! ls -lR data
data:
total 5328
-rw-r--r-- 1 root root 5454531 Jan 19 00:15 tsuda_sample.zip

1.2 python の zipfile ライブラリを利用して展開する。

In [23]:
import zipfile
import os

def extract_zip(zip_path, extract_to=None):
    """
    Extracts a ZIP file to the specified directory.

    Parameters:
        zip_path (str): Path to the ZIP file.
        extract_to (str): Directory where the files will be extracted.
                         If None, extracts to the same directory as the ZIP file.

    Returns:
        str: The path to the directory where files were extracted.

    Raises:
        FileNotFoundError: If the ZIP file does not exist.
        zipfile.BadZipFile: If the file is not a valid ZIP file.
    """
    # Check if the ZIP file exists
    if not os.path.exists(zip_path):
        raise FileNotFoundError(f"The file '{zip_path}' does not exist.")

    # Determine the extraction directory
    if extract_to is None:
        extract_to = os.path.splitext(zip_path)[0]  # Remove .zip extension to create a folder

    # Create the extraction directory if it doesn't exist
    os.makedirs(extract_to, exist_ok=True)

    # Extract the ZIP file
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        zip_ref.extractall(extract_to)

    print(f"Files extracted to: {extract_to}")
    return extract_to
In [24]:
extract_zip(os.path.join("data", ZIPFILE), "data")
Files extracted to: data
Out[24]:
'data'
In [25]:
! ls -lR data
data:
total 5332
drwxr-xr-x 2 root root    4096 Jan 19 00:23 tsuda_sample
-rw-r--r-- 1 root root 5454531 Jan 19 00:15 tsuda_sample.zip

data/tsuda_sample:
total 5356
-rw-r--r-- 1 root root 2777440 Jan 19 00:23 IMG_0535.JPG
-rw-r--r-- 1 root root 2702063 Jan 19 00:23 IMG_0543.JPG
In [26]:
# 次の実験のため、展開したファイルを消去しておく。
! (cd data; rm -rf {FOLDER})
In [ ]: