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