概要
ファイルやディレクトリを操作するpathlibの使用方法について紹介する。
Pathオブジェクトを作成して、ファイルまたはフォルダを操作する。
前提
フォルダ構成は以下とする。
Path(ファイルまたはフォルダ)情報の参照
Pathオブジェクトの作成
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()
指定したパスのフォルダを削除できる。
ただし、削除対象のフォルダが空のフォルダでないとエラーになる。
フォルダ構成
以下の場合、削除しようとしている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(“**/*“):# 指定したパス内(サブフォルダ含む)のファイルやディレクトリ一覧を取得
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