おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初級者のお勉強ノート(14)pathlibモジュール

Pythonでファイルやディレクトリを操作する際、従来はosモジュールがよく使われてきました。 しかし、Python 3.4から導入されたpathlibモジュールは、より直感的で簡潔なコードを提供します。

この記事では、pathlibモジュールの基本を学び、パス操作を効率化する方法を紹介します。

pathlibモジュールとは?

pathlibモジュールは、オブジェクト指向のアプローチでファイルやディレクトリのパスを扱うための標準モジュールです。 これにより、従来の文字列ベースのパス操作に比べ、読みやすくエラーが少ないコードを記述できます。

例えば、以下のような操作が簡単に行えます。

  • ファイル・ディレクトリの存在確認
  • パスの結合
  • 拡張子の取得・変更
  • ファイルの読み書き
  • ディレクトリの作成

モジュールを使用するには、まず以下のようにインポートします。

from pathlib import Path

基本的な使い方

Pathオブジェクトの生成

pathlibの中心となるクラスはPathです。以下のようにして、パスを表すPathオブジェクトを作成します。

from pathlib import Path

p = Path('example_dir/example_file.txt')
print(p)  # example_dir/example_file.txt

ファイルやディレクトリの存在確認

exists()メソッドを使って、パスが存在するか確認できます。

p = Path('example_dir/example_file.txt')
if p.exists():
    print("ファイルが存在します")
else:
    print("ファイルが存在しません")

ディレクトリかファイルかの判定

p = Path('example_dir')

if p.is_dir():
    print("これはディレクトリです")
elif p.is_file():
    print("これはファイルです")

パス操作の便利な機能

ディレクトリやファイル名の取得

pathlibを使うと、親ディレクトリやファイル名など、パスの構成要素を簡単に取得できます。

p = Path('example_dir/example_file.txt')

print(p.parent)  # example_dir
print(p.name)    # example_file.txt
print(p.stem)    # example_file
print(p.suffix)  # .txt

パスの結合

スラッシュ/演算子を使うと、直感的にパスを結合できます。

base = Path('example_dir')
file_path = base / 'example_file.txt'
print(file_path)  # example_dir/example_file.txt

絶対パスの取得

p = Path('example_dir/example_file.txt')
print(p.resolve())  # 絶対パスを表示

ファイルとディレクトリの操作

ディレクトリの作成

mkdir()メソッドでディレクトリを作成します。

p = Path('new_dir')
if not p.exists():
    p.mkdir()
    print(f"{p} を作成しました")

ファイルの読み書き

pathlibにはファイルの内容を直接扱う方法も用意されています。

p = Path('example.txt')

# ファイルに書き込む
p.write_text('こんにちは、Python!')

# ファイルを読み込む
content = p.read_text()
print(content)  # こんにちは、Python!

write_textメソッドを既存のファイルに対して行うと、ファイル内容を消去したうえで引数を書き込みます。 すなわち、上書きをします。

ディレクトリ内のファイル一覧

iterdir()メソッドを使うと、ディレクトリ内のファイルやサブディレクトリを取得できます。

p = Path('example_dir')

for item in p.iterdir():
    print(item)  # 各パスを表示

特定のパターンにマッチするファイルの検索

glob()メソッドを使うと、特定のパターンに一致するファイルやディレクトリを検索できます。

p = Path('example_dir')

# .txtファイルを検索
for file in p.glob('*.txt'):
    print(file)  # 例: example1.txt, example2.txt

glob()では正規表現風の書き方が使えます。例えば、以下のような表現が可能です。

  • *.txt: 拡張子が.txtのすべてのファイル
  • *data*.csv: 名前にdataが含まれるCSVファイル
  • **/*.py: サブディレクトリを含めたすべてのPythonファイル(**再帰的検索)

また、再帰的検索を行う場合はrglob()メソッドを使うこともできます。これにより、同じディレクトリ構造内でさらに柔軟な検索が可能です。

for file in p.rglob('*.py'):
    print(file)  # サブディレクトリを含むすべてのPythonファイルを表示

応用例

ファイルのバックアップ

以下の例は、ファイルを別のディレクトリにバックアップするコードです。

from pathlib import Path
import shutil

def backup_files(src_dir, backup_dir):
    src = Path(src_dir)
    backup = Path(backup_dir)

    # バックアップディレクトリが存在しなければ作成
    if not backup.exists():
        backup.mkdir()

    # ファイルをバックアップ
    for file in src.iterdir():
        if file.is_file():
            shutil.copy(file, backup / file.name)
            print(f"{file.name} をバックアップしました")

# 使用例
backup_files('example_dir', 'backup_dir')

まとめ

本記事では、以下の内容を学びました。

  1. pathlibモジュールの基本的な概要
  2. パス操作(結合、親ディレクトリ、ファイル名取得など)の基本
  3. ファイルやディレクトリの操作(作成、読み書き、存在確認など)
  4. globメソッドを用いたファイル検索とパターン指定
  5. 応用例としてのバックアップスクリプト

pathlibは、従来のosモジュールに比べて直感的で使いやすい方法を提供します。特にパス操作を簡単にするため、これからPythonでファイルやディレクトリを扱う際には、ぜひpathlibを活用してください。