Python, pathlibでディレクトリ(フォルダ)の作成・削除
Pythonのpathlibモジュールでディレクトリ(フォルダ)の新規作成および削除をする方法を説明する。Path
オブジェクトのmkdir()
およびrmdir()
メソッドを使う。
osモジュールによるパスの文字列を利用したディレクトリの作成・削除は以下の記事を参照。
- 関連記事: Pythonでディレクトリ(フォルダ)を作成するmkdir, makedirs
- 関連記事: Pythonでファイル・ディレクトリを削除するos.remove, shutil.rmtreeなど
本記事のサンプルコードでは以下のように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()
に相当するが、以下で説明する引数parents
をTrue
とするとmakedirs()
に相当する処理が可能。
中間ディレクトリをまとめて作成: 引数parents
デフォルトでは新規作成するディレクトリと既存ディレクトリの間にまだ作成されていない中間ディレクトリがあるとエラーとなる。
# Path('temp/dir/sub_dir/sub_dir2').mkdir()
# FileNotFoundError: [Errno 2] No such file or directory: 'temp/dir/sub_dir/sub_dir2'
中間ディレクトリもまとめて作成するには引数parents
をTrue
とする。
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_ok
をTrue
とすると既存のディレクトリを指定してもエラーにならない。
Path('temp/dir').mkdir(exist_ok=True)
引数exist_ok
をTrue
としてもパスの末尾がディレクトリではない場合はエラーとなる。
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