pathlib モジュールとはファイルやディレクトリを作成したり、pathを作成したり、ディレクトリやファイル、pathの存在を確認するもの。
作成したものはpathオブジェクトという
【宣言】
from pathlib import Path
【メソッド一覧】
メソッドの使い方は「ファイル名.exists()」で使う。メソッド(関数)なので()が必要
・p = Path(”ファイル名”)で作成したpathを変数pに入れる。
・ファイル名(変数).exists()で存在確認できる
・ファイル名(変数).is_file()でファイルかどうか判別できる
・ファイル名(変数).is_dir()でディレクトリかどうか判別できる
・print(ファイル名 or 変数名) 作成したファイルpathを表示する
・ファイル名.read_text()でファイルを開いて読み込むことができる
・write_text(”文字列”)で文字列を記入することができる。ファイルを開いてから行うこと
・ファイル名.glob('*')でファイル名に続くファイルやディレクトリのパスを取得できる(1階層先まで)
・ファイル名.glob('*/*')でファイル名に続くファイルやディレクトリのパスを取得できる(2階層先まで)
・ファイル名.glob('**/*')でファイル名に続くファイルやディレクトリのパスを取得できる(2階層先まで)
**は、0個以上のサブディレクトリを表している
・ファイル名.glob('*.zip')でファイル名に続く、装飾が.zipで終わるファイル名等のpathを取得できる
【プロパティ一覧】
プロパティの使い方は「ファイル名.name」で使う。関数(メソッド)ではないので()は必要ない
name ファイル名を取得
suffix 拡張子を取得
stem 拡張子以外のファイル名を取得
parts パスを分解してタプルで取得
parent 親ディレクトリーを取得
詳細解説
メソッド一覧
・p = Path(”ファイル名”)で作成したpathを変数pに入れる。
・ファイル名(変数).exists()で存在確認できる
・ファイル名(変数).is_file()でファイルかどうか判別できる
・ファイル名(変数).is_dir()でディレクトリかどうか判別できる
・print(ファイル名 or 変数名) 作成したファイルpathを表示する
書き方
from pathlib import Path ※モジュールの使用を宣言
p = Path("input") # パスの作成 Path(”ファイル名”)で作成したpathを変数に入れる
p.exists() # パスの存在確認: True ファイル名.exists()で存在確認
p.is_file() # パスがファイルかどうか確認: False ファイル名.is_file()でファイルの判別
p.is_dir() # パスがディレクトリーかどうか確認: True ファイル名.is_dir()でディレクトリの判別
print(p) #パスを表示させる
既存のパスにディレクトリーやファイルを結合して新しいパスを作成する方法
p / 'sub' / 'test.txt' のようにスラッシュ( / )演算子を利用するとパスを追加できます。
演習問題
from pathlib import Path
p = Path('input') #パスの作成
new_p = p / "sub" / "test.txt" # パスの結合
print(new_p) # パスの表示: input/sub/test.txt
print(new_p.exists() ) # パスの存在確認: True
print(new_p.is_file()) #ファイルかどうか判別する
③パスオブジェクトから、ファイルに関する情報を取り出す
パスの主なプロパティーは、次表の通りです。
プロパティの使い方は「ファイル名.name」で使う。関数(メソッド)ではないので()は必要ない
プロパティー 意味
name ファイル名を取得
suffix 拡張子を取得
stem 拡張子以外のファイル名を取得
parts パスを分解してタプルで取得
parent 親ディレクトリーを取得
演習問題
from pathlib import Path
p = Path('input')
new_p = p / 'sub' / 'test.txt' # パスの結合
print(new_p.name ) # ファイル名の取得: test.txt
print(new_p.suffix ) # 拡張子の取得: .txt
print(new_p.stem) # ファイル名の拡張子以外の部分の取得: test
print(new_p.parts) # パスを分解したものの取得: ('input', 'sub', 'test.txt')
print(new_p.parent) # 親ディレクトリーの取得: input/sub
④ファイルやディレクトリの新規作成、削除
プログラムからディレクトリーの作成や削除ができます。
メソッド一覧
mkdir() ディレクトリーを作成できます。
rmdir() rmdir() メソッドは、空のディレクトリーを削除できます。
使い方
p.mkdir(parents=True, exist_ok=True)
・parents=True
※parents がTrueのとき、大元の親ディレクトリー(/tmp/)が存在しなくても親ディレクトリーごと一気に作成してくれるので便利。デフォルトはFalseです。
・exist_ok=True
exist_ok がTrueのとき、既にディレクトリーが存在していてもエラーになりません。デフォルトはFalseです。作成時にifで存在をチェックしなくて済むので便利です。もし他のコードでディレクトリを作成していたことを忘れていても既にありますよというエラーにならない。
⑤ファイルの読み込みと相対パスと絶対パスの作成
メソッド一覧
Path(_ _ file_ _) #現在開いているファイルのpathを取得できる。変数に代入して使う
ファイル名.resolve() #パスを相対パスから絶対パスに変換できる。取得したいファイル名.resolve()で使う。
プログラム自体のファイルのパスは_ _file_ _ で取得できます。
from pathlib import Path
this_file = Path(__file__) #現在開いているファイルのpathを取得して変数に代入
data_path = (this_file.parent/ "data.csv").resolve() #this_file.parentは、this_fileの存在する親元のディレクトリ
print(data_path)
⑥pathのファイルの読み込み、書き込み
・ファイル名.read_text()
p.read_text()とすることで、パスが表すファイルから文字列を読み込みます。
自前でopenせずに読み込めます。
# ファイルのpathの読み込み
p = Path('read.txt')
・write_text()
p.write_text('TEST')とすることで、パスが表すファイルに文字列('TEST')を書き込みます。
ファイルが存在する場合、上書きされます。
自前でopenせずに書き込めます。
p = Path('test.txt') #ファイルの作成
p.write_text("TEST") #ファイルに書き込み
print( p.read_text()) # ファイルの読み込み
⑦globでファイルの走査(スキャン)できます。
・p.glob('*')とすると、'input/*'にマッチするファイル等のパスを順番に取得します。inputディレクトリにあるファイル名かディレクトリ名などのpathを取得できる。
例「input/sample.zip、input/sub」
・p.glob('*/*')とすると、'input/*/*'にマッチするファイル等のパスを順番に取得します。2つ先の階層まで表示できる。
例「input/sub/test.txt」
・p.glob('**/*')とすると、'input/**/*'にマッチするファイル等のパスを順番に取得します。
ただし、**は、0個以上のサブディレクトリを表しています。
例「input/sample.zip、input/sub、input/sub/test.txt」
・p.glob('*.zip')とすると、'input/*.zip'にマッチするファイル等のパスを順番に取得します。
例「input/sample.zip」
・open(補足)
with open(p, encoding)の代わりにp.open(…)でファイルを開くことができる(ただし、一部のオプションは利用できません)。
比較
with open(p, mode='w') as f:
f.write('TEST')
with p.open(mode='w') as f:
f.write('TEST')