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

Pythonのpathlibモジュールを使ってディレクトリ(フォルダ)の新規作成および削除をする方法について説明します。 pathlibはPython3.4から追加されたモジュール。ファイルやディレクトリのパスをオブジェクトとして操作できます。標準ライブラリに含まれているので追加のインストールは不要(importは必要)。

pathlib --- オブジェクト指向のファイルシステムパス — Python 3.7.1rc1 ドキュメント

ここでは以下の内容について説明します。

ディレクトリを作成: mkdir() 中間ディレクトリをまとめて作成: 引数parents ディレクトリがすでに存在していてもエラーにしない: 引数exist_ok ディレクトリを削除: rmdir() 中身ごと削除: shutil.rmtree()osモジュールによるパスの文字列を利用したディレクトリの作成・削除は

pathlibの基礎、ファイルの処理については

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

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

pathlib - mkdir() --- オブジェクト指向のファイルシステムパス — Python 3.7.1rc1 ドキュメント

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

以下のように一行で書いても問題ありません。

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()メソッドを使います。

pathlib - rmdir() --- オブジェクト指向のファイルシステムパス — Python 3.7.1rc1 ドキュメント

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() --- 高水準のファイル操作 — Python 3.7.1rc1 ドキュメント

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

import shutil

shutil.rmtree(p)

print(p.exists())
# False
Last Updated: 6/26/2019, 10:34:03 PM