【pathlib】Pythonでファイル操作:pathlibモジュールの基本的な使用方法

概要

ファイルやディレクトリを操作するpathlibの使用方法について紹介する。
Pathオブジェクトを作成して、ファイルまたはフォルダを操作する。

 

前提

フォルダ構成は以下とする。

【pathlibモジュール】フォルダ構成
▲Python実行ファイルはop_pathlib.ipynb

 

Path(ファイルまたはフォルダ)情報の参照

Pathオブジェクトの作成

Pathオブジェクトは以下のように作成する。

from pathlib import Path
Pathオブジェクト変数 = Path(ファイルまたはフォルダパス)

生成したPathオブジェクト変数を参照すると、引数で指定したパス情報を確認できる。
尚、Pathの引数には存在しないパスも設定可能。

 

Pathオブジェクトの存在確認:exists()

指定したPathオブジェクト(ファイルパスまたはフォルダパス)は存在するか判定する。


from pathlib import Path

# 存在しないケース
# パスオブジェクトの生成
path = Path("input_dir")
# 指定されたパスを表示
print(path) # input_dir
# 指定されたパスが存在するか
print(path.exists()) # False

# 存在するケース(フォルダ)
path2 = Path("work")
print(path2) # work
print(path2.exists()) # True

# 存在するケース(ファイル)
path3 = Path("test02.txt")
print(path3) # test02.txt
print(path3.exists()) # True

 

Pathオブジェクトがファイルかどうか確認:is_file()

指定したPathオブジェクトはファイルかどうかを判定する。


from pathlib import Path

# パスがフォルダの場合
path = Path("work")
print(path.is_file()) # False

# パスがファイルの場合
path2 = Path("test02.txt")
print(path2.is_file()) # True

 

Pathオブジェクトがフォルダかどうか確認:is_dir()

指定したPathオブジェクトはフォルダかどうかを判定する。


from pathlib import Path

# パスがフォルダの場合
path = Path("work")
print(path.is_dir()) # True

# パスがファイルの場合
path2 = Path("test02.txt")
print(path2.is_dir()) # False

 

Pathの結合

「/」演算子を使用してパス情報を結合できる。
文字列同士を「/」演算子で区切ることはできないので注意。


from pathlib import Path

path = Path("work")
# パスの結合
dir_path = path / "input_dir" / "sub_dir"
print(dir_path.exists()) # True
print(dir_path.is_dir()) # True

# パスの結合
file_path = dir_path / "test01.txt"
print(file_path.exists()) # True
print(file_path.is_file()) # True

 

Pathオブジェクトのプロパティ

プロパティ 意味
name ファイル名
suffix 拡張子
stem 拡張子以外のファイル名
parts パスを分解したタプル情報
parent

親フォルダ

 


from pathlib import Path

# パスがフォルダ
path = Path("work")
dir_path = path / "input_dir" / "sub_dir"
print(dir_path.name) # フォルダ名:sub_dir
print(dir_path.parts) # パス分解情報:('work', 'input_dir', 'sub_dir')
print(dir_path.parent) # 親フォルダ:work\input_dir

# パスがファイル
file_path = dir_path / "test01.txt"
print(file_path.name) # ファイル名:test01.txt
print(file_path.suffix) # 拡張子:.txt
print(file_path.stem) # 拡張子以外のファイル名:test01
print(file_path.parts) # パス分解情報:('work', 'input_dir', 'sub_dir', 'test01.txt')
print(file_path.parent) # 親フォルダ:work\input_dir\sub_dir

 

 

Path情報の操作

フォルダの作成:mkdir()

Pathオブジェクト.mkdir(parents=True, exist_ok=True)

parents=Trueの場合、親フォルダが存在しないパスでも、親フォルダごと作成する。
デフォルトでFalseのため、設定しない場合は存在する親フォルダ配下にてmkdir()しないとエラーになる

exist_ok=Trueの場合、既に作成しようとする名前のフォルダが存在していてもエラーにならない。
デフォルトでFalseのため、設定しない場合は同名のフォルダでmkdir()するとエラーになる

 


from pathlib import Path

p = Path("tmp/new_dir")
# フォルダ作成
p.mkdir(parents=True, exist_ok=True)
# 存在確認
print(p.exists())

p2 = Path("tmp2/new_dir")
# フォルダ作成
p2.mkdir()# FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: 'tmp2\\new_dir'

 

フォルダの削除:rmdir()

指定したパスのフォルダを削除できる。

ただし、削除対象のフォルダが空のフォルダでないとエラーになる

フォルダ構成

 

【pathlibモジュール】フォルダ削除前の構成
▲tmpフォルダ配下にnew_dirフォルダが存在する状態

 

以下の場合、削除しようとしているtmpフォルダ内が空ではないためエラーになる。


from pathlib import Path

# 空ではないフォルダ
p = Path("tmp")
p.rmdir() # OSError: [WinError 145] ディレクトリが空ではありません。: 'tmp'

 

以下は問題なく削除されるケース。
※tmpフォルダ内のフォルダを削除したため、tmpフォルダが空フォルダとなる


from pathlib import Path

# 空ォルダ
p = Path("tmp/new_dir")
p.rmdir()

p2 = Path("tmp")
p2.rmdir()

 

ファイルの読み込み:read_text()

指定したPathについて、ファイルの中身を参照できる。


from pathlib import Path

p = Path("work/input_dir/sub_dir/test01.txt")
print(p.read_text()) # ファイルの中身をすべて表示
print(type(p.read_text())) # <class 'str'>

#-------------------------------------------------
# 出力
#1300
#700
#1800

 

ファイルの書き込み:write_text()

指定したファイルに書き込む。
上書き保存となる。


from pathlib import Path

p = Path("test02.txt")
p.write_text("あいうえお\nかきくけこ\nさしすせそ")

print(p.read_text())
#---------------------------
# 出力
#あいうえお
#かきくけこ
#さしすせそ

 

パス内のファイル、フォルダの表示:glob()

指定したパス配下のファイルおよびフォルダを表示する。

使用例

Pathオブジェクト.glob(“*“):# 指定したパス内のファイルやディレクトリ一覧を取得
Pathオブジェクト.glob(“**/*“):# 指定したパス内(サブフォルダ含む)のファイルやディレクトリ一覧を取得

 


from pathlib import Path

# pythonファイルのカレントディレクトリ内
print("カレントフォルダ配下-------------")
p = Path()
for path in p.glob("*"):
    print(path)

# workフォルダ配下
print("\nworkフォルダ配下-------------")
p = Path("work")
for path in p.glob("*"):
    print(path)

# workフォルダ配下をすべて表示
print("\nworkフォルダ配下(サブフォルダも含む)-------------")
for path in p.glob("**/*"):
    print(path)

# ---------------------------------------
# 出力
#カレントフォルダ配下-------------
#.ipynb_checkpoints
#op_pathlib.ipynb
#test02.txt
#work

#workフォルダ配下-------------
#work\input_dir

#workフォルダ配下(サブフォルダも含む)-------------
#work\input_dir
#work\input_dir\sub_dir
#work\input_dir\test01.zip
#work\input_dir\sub_dir\test01.txt

 

スポンサーリンク