note.nkmk.me

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

Date: 2018-10-01 / tags: Python, ファイル操作

Pythonのpathlibモジュールを使ってディレクトリ(フォルダ)の新規作成および削除をする方法について説明する。

pathlibはPython3.4から追加されたモジュール。ファイルやディレクトリのパスをオブジェクトとして操作できる。標準ライブラリに含まれているので追加のインストールは不要(importは必要)。

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

  • ディレクトリを作成: mkdir()
    • 中間ディレクトリをまとめて作成: 引数parents
    • ディレクトリがすでに存在していてもエラーにしない: 引数exist_ok
  • ディレクトリを削除: rmdir()
    • 中身ごと削除: shutil.rmtree()

osモジュールによるパスの文字列を利用したディレクトリの作成・削除は以下の記事を参照。

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()に相当するが、以下で説明する引数parentsTrueとすると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'

中間ディレクトリもまとめて作成するには引数parentsTrueとする(デフォルトは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_okTrueとすると既存のディレクトリを対象としてもエラーにならない。

pathlib.Path('temp/dir').mkdir(exist_ok=True)

引数exist_okTrueとしてもパスの末尾がディレクトリではない場合はエラーとなる。

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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事