Python, pathlibでディレクトリ(フォルダ)の作成・削除

Modified: | Tags: Python, ファイル処理

Pythonのpathlibモジュールでディレクトリ(フォルダ)の新規作成および削除をする方法を説明する。Pathオブジェクトのmkdir()およびrmdir()メソッドを使う。

osモジュールによるパスの文字列を利用したディレクトリの作成・削除は以下の記事を参照。

本記事のサンプルコードでは以下のようにpathlibモジュールからPathクラスをインポートしている。pathlibは標準ライブラリに含まれているので追加のインストールは不要。

from pathlib import Path

ディレクトリを作成: mkdir()

ディレクトリを作成するにはPathオブジェクトのmkdir()メソッドを使う。

Path()Pathオブジェクトを生成する。作成したいディレクトリのパスを引数に文字列で指定する。相対パスでも絶対パスでもよい。

p = Path('temp')
print(p)
# temp

print(type(p))
# <class 'pathlib.PosixPath'>

OSによってPosixPathまたはWindowsPathのインスタンスが生成される。

Pathの基礎については以下の記事を参照。

この時点ではディレクトリは存在していない。exists()で確認。

print(p.exists())
# False

mkdir()でディレクトリを作成できる。

p.mkdir()

print(p.exists())
# True

print(p.is_dir())
# True

以下のように、Pathオブジェクトの生成とmkdir()の実行を一行で書いてもよい。

Path('temp/dir').mkdir()

print(Path('temp/dir').is_dir())
# True

デフォルトではPathオブジェクトのmkdir()はosモジュールのmkdir()に相当するが、以下で説明する引数parentsTrueとするとmakedirs()に相当する処理が可能。

中間ディレクトリをまとめて作成: 引数parents

デフォルトでは新規作成するディレクトリと既存ディレクトリの間にまだ作成されていない中間ディレクトリがあるとエラーとなる。

# Path('temp/dir/sub_dir/sub_dir2').mkdir()
# FileNotFoundError: [Errno 2] No such file or directory: 'temp/dir/sub_dir/sub_dir2'

中間ディレクトリもまとめて作成するには引数parentsTrueとする。

Path('temp/dir/sub_dir/sub_dir2').mkdir(parents=True)

print(Path('temp/dir/sub_dir/sub_dir2').is_dir())
# True

ディレクトリがすでに存在していてもエラーにしない: 引数exist_ok

デフォルトではすでに存在するディレクトリを作成しようとするとエラーとなる。

# Path('temp/dir').mkdir()
# FileExistsError: [Errno 17] File exists: 'temp/dir'

引数exist_okTrueとすると既存のディレクトリを指定してもエラーにならない。

Path('temp/dir').mkdir(exist_ok=True)

引数exist_okTrueとしてもパスの末尾がディレクトリではない場合はエラーとなる。

Path('temp/dir/file').touch()

print(Path('temp/dir/file').is_file())
# True

# Path('temp/dir/file').mkdir(exist_ok=True)
# FileExistsError: [Errno 17] File exists: 'temp/dir/file'

この例ではtouch()で空のファイルを作成している。ファイルの作成については以下の記事を参照。

ディレクトリを削除: rmdir()

ディレクトリを削除するにはPathオブジェクトのrmdir()メソッドを使う。

p_sub_dir = Path('temp/dir/sub_dir/sub_dir2')

print(p_sub_dir.is_dir())
# True

p_sub_dir.rmdir()

print(p_sub_dir.exists())
# False

rmdir()が削除できるのは中身が空のディレクトリのみ。ファイルやサブディレクトリを含むディレクトリは削除できない。

p = Path('temp')

# p.rmdir()
# OSError: [Errno 66] Directory not empty: 'temp'

pathlibのPathオブジェクトには中身ごと削除するメソッドはない。

空でないディレクトリを中身ごと削除するにはshutilモジュールのshutil.rmtree()を使う。

shutil.rmtree()の引数にはパスの文字列だけでなくPathオブジェクトも指定できる。

import shutil

shutil.rmtree(p)

print(p.exists())
# False

関連カテゴリー

関連記事