Python, pathlibでディレクトリ(フォルダ)の作成・削除
Pythonのpathlibモジュールを使ってディレクトリ(フォルダ)の新規作成および削除をする方法について説明する。
pathlibはPython3.4から追加されたモジュール。ファイルやディレクトリのパスをオブジェクトとして操作できる。標準ライブラリに含まれているので追加のインストールは不要(import
は必要)。
ここでは以下の内容について説明する。
- ディレクトリを作成:
mkdir()
- 中間ディレクトリをまとめて作成: 引数
parents
- ディレクトリがすでに存在していてもエラーにしない: 引数
exist_ok
- 中間ディレクトリをまとめて作成: 引数
- ディレクトリを削除:
rmdir()
- 中身ごと削除:
shutil.rmtree()
- 中身ごと削除:
osモジュールによるパスの文字列を利用したディレクトリの作成・削除は以下の記事を参照。
- 関連記事: Pythonでディレクトリ(フォルダ)を作成するmkdir, makedirs
- 関連記事: Pythonでファイル・ディレクトリを削除するos.remove, shutil.rmtreeなど
pathlibの基礎、ファイルの処理については以下の記事を参照。
ディレクトリを作成: mkdir()
ディレクトリを作成するにはPath
オブジェクトのmkdir()
メソッドを使う。
pathlib.Path()
でPath
オブジェクトを生成する。
import pathlib
p = pathlib.Path('temp')
print(p)
# temp
print(type(p))
# <class 'pathlib.PosixPath'>
Path
の基礎については以下の記事を参照。
この時点ではディレクトリは存在していない。exists()
で確認。
print(p.exists())
# False
mkdir()
でディレクトリが新規作成される。
p.mkdir()
print(p.exists())
# True
print(p.is_dir())
# True
以下のように一行で書いてもOK。
pathlib.Path('temp/dir').mkdir()
print(pathlib.Path('temp/dir').is_dir())
# True
デフォルトではPath
オブジェクトのmkdir()
はosモジュールのmkdir()
に相当するが、以下で説明する引数parents
をTrue
とするとmakedirs()
に相当する処理が可能。
中間ディレクトリをまとめて作成: 引数parents
デフォルトでは新規作成するディレクトリと既存ディレクトリの間にまだ作成されていない中間ディレクトリがあるとエラーとなる。
# pathlib.Path('temp/dir/sub_dir/sub_dir2').mkdir()
# FileNotFoundError: [Errno 2] No such file or directory: 'temp/dir/sub_dir/sub_dir2'
中間ディレクトリもまとめて作成するには引数parents
をTrue
とする(デフォルトはFalse
)。
pathlib.Path('temp/dir/sub_dir/sub_dir2').mkdir(parents=True)
print(pathlib.Path('temp/dir/sub_dir/sub_dir2').is_dir())
# True
ディレクトリがすでに存在していてもエラーにしない: 引数exist_ok
デフォルトではすでに存在するディレクトリを作成しようとするとエラーとなる。
# pathlib.Path('temp/dir').mkdir()
# FileExistsError: [Errno 17] File exists: 'temp/dir'
引数exist_ok
をTrue
とすると既存のディレクトリを対象としてもエラーにならない。
pathlib.Path('temp/dir').mkdir(exist_ok=True)
引数exist_ok
をTrue
としてもパスの末尾がディレクトリではない場合はエラーとなる。
pathlib.Path('temp/dir/file').touch()
print(pathlib.Path('temp/dir/file').is_file())
# True
# pathlib.Path('temp/dir/file').mkdir(exist_ok=True)
# FileExistsError: [Errno 17] File exists: 'temp/dir/file'
なお、この例ではtouch()
で空のファイルを作成している。ファイルの作成については以下の記事を参照。
ディレクトリを削除: rmdir()
ディレクトリを削除するにはPath
オブジェクトのrmdir()
メソッドを使う。
p_sub_dir = pathlib.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 = pathlib.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