[解決!Python]ディレクトリを作成/削除するには:pathlibモジュール編:解決!Python
pathlibモジュールのPathクラスが提供するmkdir/rmdirメソッドを使って、Pythonのコードからディレクトリを作成/削除する方法を紹介する。
from pathlib import Path
# Path.mkdirメソッドを使ったディレクトリ作成
target_dir = Path('sample_dir')
target_dir.mkdir()
# ディレクトリが既に存在している場合
target_dir.mkdir() # FileExistsError
target_dir.mkdir(exist_ok=True) # OK
target = Path('tmp')
target.touch() # ファイルを作成
target.mkdir(exist_ok=True) # FileExistsError:既存のファイルに対しては例外
# Path.mkdirメソッドを使った再帰的なディレクトリ作成
target_dir = Path('sample_dir/dir2/dir3')
target_dir.mkdir() # FileNotFoundError:dir2ディレクトリがなくdir3は作成不可
target_dir.mkdir(parents=True) # OK:parents=Trueで足りない親ディレクトリを作成
# Path.rmdirメソッドを使ったディレクトリ削除
target_dir = Path('sample_dir/dir2/dir3')
target_dir.rmdir()
# sample_dir/dir2ディレクトリまでは削除されずに残っている
dirs = [item for item in Path('sample_dir').iterdir()]
print(dirs) # [PosixPath('sample_dir/dir2')]/[WindowsPath('sample_dir/dir2')]
dirs = [item for item in Path('sample_dir/dir2').iterdir()]
print(dirs) # []
target_dir = Path('sample_dir')
target_dir.rmdir() # OSError:dir2ディレクトリがあるので削除できない
target_dir = Path('sample_dir/dir2')
target_dir.rmdir()
target_dir = Path('sample_dir')
target_dir.rmdir()
# os.removedirs関数はPathオブジェクトを受け取れる
import os
target_dir = Path('sample_dir/dir2/dir3')
target_dir.mkdir(parents=True)
os.removedirs(target_dir) # 3つのディレクトリをまとめて削除
# 指定したディレクトリの内容を全て削除する
import shutil
shutil.rmtree('sample_dir')
ディレクトリの作成/削除に使えるモジュール
Pythonのコードからファイルシステム上でディレクトリを作成したり削除したりするには幾つかの方法がある。
- osモジュールを使用する
- pathlibモジュールを使用する
- shutilモジュールを使用する(再帰的なディレクトリ削除)
本稿ではこのうちpathlibモジュールを使用する方法とshutilモジュールのrmtree関数を使ってディレクトリを再帰的に削除する方法を紹介する。osモジュールを使ったディレクトリの作成と削除については「ディレクトリを作成/削除するには:osモジュール編」を参照されたい。
Path.mkdirメソッドを使ったディレクトリ作成
pathlibモジュールが提供するPathクラスを利用すると、さまざまなOSプラットフォームにおけるパス操作(ディレクトリやファイルの操作)を抽象化できる。Pathクラスを使ってディレクトリを作成するには、Pathクラス(実際にはPosixPathクラスやWindowsPathクラスのインスタンスとなる)が持つmkdirインスタンスメソッドを使用する。
以下に例を示す。
from pathlib import Path
target_dir = Path('sample_dir')
target_dir.mkdir()
この例ではsample_dirディレクトリを表すPathクラスのインスタンスを作成して、そのmkdirメソッドを呼び出している。これにより、カレントディレクトリの直下にsample_dirディレクトリが作成される。
mkdirメソッドで作成しようとしたディレクトリが既に存在している場合には、デフォルトではFileExistsError例外が発生する。例外の発生を抑制するには、exist_okパラメーターにTrueを指定する。その場合、作成しようとしたディレクトリが既に存在している場合でも例外が発生しないようになる。
target_dir.mkdir() # FileExistsError
target_dir.mkdir(exist_ok=True) # OK
ただし、mkdirメソッドで作成しようとしたディレクトリと同名の「ファイル」が存在していた場合には、やはりFileExistsError例外が発生することには注意しておこう。
target = Path('tmp')
target.touch() # ファイルを作成
target.mkdir(exist_ok=True) # FileExistsError:既存ファイルに対しては例外が発生
osモジュールにはmakedirs関数があり、これを使うと複数階層のディレクトリを再帰的に作成できる。Path.mkdirメソッドでも同様な処理が可能だ。これには、Path.mkdirメソッドのparentsパラメーターにTrueを指定すればよい。
以下にsample_dir/dir2/dir3ディレクトリを作成する例を示す(この時点では上のコードによりsample_dirディレクトリが存在している状態とする)。
target_dir = Path('sample_dir/dir2/dir3')
target_dir.mkdir() # FileNotFoundError:dir2ディレクトリがなくdir3は作成不可
target_dir.mkdir(parents=True) # OK:parents=Trueで足りない親ディレクトリを作成
2行目(最初のmkdirメソッド呼び出し)では、FileNotFoundError例外が発生する。これは上のコード例でsample_dirディレクトリを作成した状態で、sample_dir/dir2/dir3ディレクトリを作成しようとしたが、中間のdir2ディレクトリがないためにdir3ディレクトリを作成できないためだ。
一方、3行目(2つ目のmkdirメソッド呼び出し)ではparentsパラメーターにTrueを指定している。これにより、中間のdir2ディレクトリが自動的に作成され、最終的にsample_dir/dir2/dir3ディレクトリが作成される。
Path.rmdirメソッドを使ったディレクトリ削除
Copyright© Digital Advantage Corp. All Rights Reserved.