Pythonでディレクトリ走査とZIPファイル操作:os.walkとzipfile

この記事では、Pythonの標準ライブラリを使い、ファイルシステムのディレクトリ構造を再帰的に走査(渡り歩く)する方法と、ZIPアーカイブの作成、読み込み、展開を行う方法について解説します。


目次

os.walk()によるディレクトリツリーの操作

os.walk()は、指定したフォルダを起点として、その中に含まれるすべてのサブフォルダとファイルを再帰的に探索するための強力なジェネレータです。forループと組み合わせることで、ディレクトリツリーの各階層を順番に処理できます。

ループの各イテレーションでは、以下の3つの値を持つタプルが返されます。

  1. 現在処理しているフォルダのパス(文字列)
  2. そのフォルダに含まれるサブフォルダ名のリスト(文字列のリスト)
  3. そのフォルダに含まれるファイル名のリスト(文字列のリスト)
import os
from pathlib import Path

# --- 探索対象のサンプルディレクトリ構造を作成 ---
# ./sample_dir/
# ├── data.csv
# ├── images/
# │   ├── icon.png
# │   └── logo.jpg
# └── documents/
#     └── report.docx

Path("sample_dir/images").mkdir(parents=True, exist_ok=True)
Path("sample_dir/documents").mkdir(exist_ok=True)
Path("sample_dir/data.csv").touch()
Path("sample_dir/images/icon.png").touch()
Path("sample_dir/images/logo.jpg").touch()
Path("sample_dir/documents/report.docx").touch()
# ---------------------------------------------

# 'sample_dir'を起点にディレクトリツリーを走査
for dir_path, sub_dir_names, file_names in os.walk("sample_dir"):
    print(f"現在のフォルダ: {dir_path}")

    for sub_dir in sub_dir_names:
        print(f"  サブフォルダ: {sub_dir}")

    for file_name in file_names:
        print(f"  ファイル: {file_name}")
    
    print("-" * 20)

zipfileモジュールによるZIPファイルの圧縮・展開

zipfileモジュールは、ZIP形式のアーカイブファイルを扱うための完全な機能を提供します。ファイルの安全な操作のため、with文を使用することが推奨されます。

ZIPファイルの読み込み zipfile.ZipFile()でZIPファイルを開き、その内容を調べることができます。

import zipfile

# 読み込むZIPファイルを準備
# with zipfile.ZipFile("archive.zip", "w") as zf:
#     zf.writestr("info.txt", "This is some information.")

# ZIPファイルを開いて情報を読み取る
with zipfile.ZipFile("archive.zip", "r") as zf:
    # 含まれるファイルの一覧を取得
    print(f"ファイル一覧: {zf.namelist()}")
    
    # 特定のファイル情報を取得
    file_info = zf.getinfo("info.txt")
    print(f"ファイルサイズ: {file_info.file_size} bytes")
    print(f"圧縮後サイズ: {file_info.compress_size} bytes")

ZIPファイルの展開 extractall()メソッドでアーカイブ内のすべてのファイルを展開したり、extract()メソッドで特定のファイルだけを展開したりできます。

import zipfile
from pathlib import Path

# 展開先フォルダを準備
Path("unzipped_files").mkdir(exist_ok=True)

with zipfile.ZipFile("archive.zip", "r") as zf:
    # すべてのファイルを展開
    # zf.extractall("unzipped_files")
    
    # 特定のファイルだけを展開
    zf.extract("info.txt", "unzipped_files")

print("ファイルを'unzipped_files'フォルダに展開しました。")

ZIPファイルの作成 zipfile.ZipFile()を書き込みモード('w')または追記モード('a')で開くことで、新しいZIPファイルを作成したり、既存のファイルに追加したりできます。

import zipfile

# 書き込むファイルを準備
Path("document.txt").write_text("Hello, world.")

# 'w'モードで新しいZIPファイルを作成
with zipfile.ZipFile("new_archive.zip", "w", compression=zipfile.ZIP_DEFLATED) as zf:
    # ファイルをZIPアーカイブに追加
    zf.write("document.txt")

print("new_archive.zip を作成しました。")

compression=zipfile.ZIP_DEFLATEDは、ファイルを圧縮して保存するための標準的な指定です。

まとめ

os.walk()は、複雑なディレクトリ構造を再帰的に探索し、ファイルリストを作成するなどのバッチ処理に非常に役立ちます。zipfileモジュールは、ZIPアーカイブの作成、内容の確認、ファイルの展開といった操作をPythonスクリプトから直接行うための包括的なツールです。これらの機能を組み合わせることで、ファイル管理タスクの多くを自動化できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次