Python の pathlib モジュールで パス作成 ⇒ 存在確認 ⇒ 実体作成 ⇒ 削除 を行うコード例です。
それから、解説です。『どうやって元のパスを取得するのか?⇒ str(p)』とか、『既存の Path から新しい Path を作る方法 ⇒ Path(p), p.joinpath()』などを書きました。
パス文字列を pathlib で扱うアプローチは、とても良かったです。
従来の os モジュールを使うよりも、コードが短く、簡単に書けました。
ここでは
- 新しく Path を作る。
- フォルダ (folder) の存在確認をしてから、フォルダを作る。削除する。
- Path から新しい Path を作る。
- ファイル (file) の存在確認をしてから、ファイルを作る。削除する。
の『コード例』と『解説』を紹介します。
pathlib のコード例
pathlib モジュールから Path をインポートして使っています。
実行すると、指定した場所にフォルダを作り、ファイルを作り、最後に削除します。
ところで、print() の中で使っている f'{変数}'
は、『フォーマット済み文字列リテラル』とか『f-string』と呼ばれるものです。テキストの中に、変数を自然に埋め込むことができるので、とても便利なのです。
Python マニュアル
フォーマット済み文字列リテラル
(Python 3.6 から使用可能)
from pathlib import Path
def main():
"""メイン関数"""
print('Start\n')
# 新しく『フォルダ』を作りたい!
# (1/5) フォルダパスのインスタンスを作る
data_dir = Path(r'F:\apps\data')
print(f'{data_dir}: data_dir')
# (2/5) パスを取得するときは str() に渡す。
t = str(data_dir)
print(f'{t}: str(data_dir)\n')
# (3/5) フォルダが無ければ作る。
if not data_dir.is_dir():
print(f'フォルダが存在しない: {str(data_dir)}\n')
# (4/5) フォルダを作成。
data_dir.mkdir()
print(f'フォルダを作成: {str(data_dir)}\n')
# (5/5) フォルダの存在を確認する。
print(f'フォルダはある?: {data_dir.is_dir()}\n')
# 新しく『テキストファイル』を作りたい!
# (1/5) ファイルパスのインスタンスを作る。
text_file = data_dir.joinpath('memo.txt')
print(f'{text_file}: text_file\n')
# (2/5) ファイルが無ければ作る。
if not text_file.is_file():
print(f'ファイルが存在しない: {str(text_file)}\n')
# (3/5) ファイルを作成。
text_w = f'ファイル名は {text_file.name}'
with text_file.open('w', encoding='utf-8') as fw:
fw.write(text_w)
print(f'ファイルを作成: {str(text_file)}\n')
# (4/5) ファイルの存在を確認する。
print(f'ファイルはある?: {text_file.is_file()}\n')
# (5/5) ファイルを読み込む。
with text_file.open('r', encoding='utf-8') as fr:
text_r = fr.read()
print(f'ファイルの内容: {text_r}\n')
# 『テキストファイル』を削除したい!
# (1/2) ファイルを削除する。アンリンク
text_file.unlink()
print(f'ファイルを削除した: {str(text_file)}\n')
# (2/2) ファイルの存在を確認する。
print(f'ファイルはある?: {text_file.is_file()}\n')
# 『フォルダ』を削除したい!
# (1/2) フォルダを削除する。
data_dir.rmdir()
print(f'フォルダを削除した: {str(text_file)}\n')
# (2/2) フォルダの存在を確認する。
print(f'フォルダはある?: {data_dir.is_dir()}\n')
print('End')
return
if __name__ == '__main__':
main()
実行結果
pathlib のコード例の実行結果です。
Visual Studio Code でステップ実行しながら、実際にエクスプローラーでフォルダの場所を見ていたら、確かにフォルダができて、ファイルができて、最後に削除されていました。
Start
F:\apps\data: data_dir
F:\apps\data: str(data_dir)
フォルダが存在しない: F:\apps\data
フォルダを作成: F:\apps\data
フォルダはある?: True
F:\apps\data\memo.txt: text_file
ファイルが存在しない: F:\apps\data\memo.txt
ファイルを作成: F:\apps\data\memo.txt
ファイルはある?: True
ファイルの内容: ファイル名は memo.txt
ファイルを削除した: F:\apps\data\memo.txt
ファイルはある?: False
フォルダを削除した: F:\apps\data\memo.txt
フォルダはある?: False
End
pathlib の解説
コード例で使用した pathlib の機能の解説です。
Path() で新しいパスを作る
今まで r'F:\apps\data'
のように書いていたところに、Path()
を使います。
p = Path(r'F:\apps\data')
これで、p に続けてドット (.) を打つだけで、ファイル名を取り出したり、拡張子を取り出したり、存在確認をしたり、色々なことができるようになりました。
Python マニュアルclass pathlib.Path(*pathsegments)
従来は、os.path.basename(p) とか、os.path.splitext(p)[1] とか、かなり長いコードを書く必要がありました。
それが、p.name()、p.suffix() で済むようになりました。
とても便利になりました。なので、新しいプログラムでは pathlib をメインで使うようになりました。
ほかにも、名前空間で os や os.path にある関数名が消費されないところも好きです。
元のパス文字列を取得する方法 ⇒ str(p)
p = Path('パス文字列')
と書いた時の『パス文字列』は、組み込み関数の str() で取得できました。
"""Path のインスタンスから元のパス文字列を取得するコード例"""
from pathlib import Path
p = Path(r'F:\apps\data')
t = str(p)
print(t)
実行結果です。
F:\apps\data
Python マニュアル
pathlib — オブジェクト指向のファイルシステムパス
純粋パス 演算子 str(p)
組み込み型class str(object='')
Path から新しい Path を作る方法
既存の Path インスタンスから新しい Path を作る方法です。
Path() に『既存の Path インスタンス』を渡したり、p.joinpath() を使うことで、新しい Path を作ることが出来ました。
独立か否かの確認方法です。組み込み関数の id() 関数を使いました。
Python マニュアル
組み込み関数 id(object)
id(p) の数値が違っていれば、独立したインスタンスだと分かります。
Path() に『既存の Path インスタンス』を渡す
Path() に『既存の Path インスタンス』を渡したら、パス文字列が同じで、独立した Path インスタンスができました。
"""既存の Path インスタンスから新しい Path インスタンスを作るコード例"""
from pathlib import Path
p = Path(r'F:\apps\data')
new_p = Path(p)
print(f'{id(p)} ← id(p) {p}')
print(f'{id(new_p)} ← id(new_p) {new_p}')
実行結果です。※ id() の数値は、実行するたびに変わります。
42605704 ← id(p) F:\apps\data
42605816 ← id(new_p) F:\apps\data
期待したとおり、値が違っています。
新しい Path インスタンスが出来ていました。
p.joinpath() を使う
たとえば、p.joinpath() に追加のパスを渡すと、新しい Path インスタンスが返りました。
Python マニュアル
PurePath.joinpath(*other)
"""p.joinpath() で新しい Path インスタンスを作るコード例"""
from pathlib import Path
p = Path(r'F:\apps\data')
new_p = p.joinpath('memo.txt')
print(f'{id(p)} ← id(p) {p}')
print(f'{id(new_p)} ← id(new_p) {new_p}')
実行結果です。※ id() の数値は、実行するたびに変わります。
42995048 ← id(p) F:\apps\data
42995160 ← id(new_p) F:\apps\data\memo.txt
期待したとおり、値が違っています。
新しい Path インスタンスが出来ていました。
フォルダ (folder) の存在確認 ⇒ p.is_dir()
p.is_dir() は、os.path.isdir() にあたるメソッドです。
Python マニュアル
Path.is_dir()
is_dir() は、YouTube で『イズ ディーアイアー』と読んでいる方がいました。流して読むときは『イズ ダー』って読んでいました。
フォルダの作成方法 ⇒ p.mkdir()
p.mkdir() は、os.mkdir() にあたるメソッドです。
Python マニュアル
Path.mkdir(mode=0o777, parents=False, exist_ok=False)
mkdir() は、YouTube で『エムケー ディーアイアー』と読んでいる方がいました。流して読むときは『エムケー ダー』って読んでいました。
ファイル (file) の存在確認 ⇒ p.is_file()
p.is_file() は、os.path.isfile() にあたるメソッドです。
Python マニュアル
Path.is_file()
is_file() は、YouTube で『イズ ファイル』と読んでいる方がいました。
テキストファイルへの書込と読込 ⇒ p.open()
p.open() は、組み込み関数の open() にあたるメソッドです。
p.open('w', encoding='utf-8') # 書き込みモード
p.open('r', encoding='utf-8') # 読み込みモード
Python マニュアルPath.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
ファイルを削除する方法 ⇒ p.unlink() アンリンク
p.unlink() は、os.remove() と os.unlink() にあたるメソッドです。
Python マニュアル
Path.unlink()
unlink() は、YouTube で『アンリンク』と読んでいる方がいました。
自分としては、ファイルを消すって、del とか delete のイメージだったんですが、os.unlink() の説明を読んだら、Python は Unix で昔から使われている名前に合わせた、みたいでした。
フォルダを削除する方法 ⇒ p.rmdir()
p.rmdir() は、os.rmdir() にあたるメソッドです。
フォルダを削除するときは、フォルダの中身を空っぽにしておく必要があるとのことでした。
Python マニュアル
Path.rmdir()
rmdir() は、YouTube で『アールエム ディーアイアー』と読んでいる方がいました。流して読むときは『アールエム ダー』って読んでいました。
pathlib.Path インスタンスのキャプチャ画像
pathlib.Path インスタンスのキャプチャ画像です。参考用に撮りました。
Visual Studio Code の WATCH ウィンドウのところの画像になります。