こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。
pythonでファイルの入出力を行うとき、”os.path”モジュールを使ってパス設定をするのですが、もっとスマートなやり方をないかなぁ…と調べていたら
Python3.4で追加された、”pathlib”モジュールというものがあることを知りました。
本稿では、”pathlib”の便利な使い方を分かりやすく説明します。
本稿の終盤で、Jupyter Notebookを使って作成した”はやぶさ”の技術ノートも公開しますので、最後まで読んで頂けると嬉しいです。
Contents
はじめに
以降で説明するソースコードは、下記のディレクトリツリーで検証を行いました。
1 2 3 4 5 6 7 8 9 |
workspace -- test_pathlib.py | -- tmp -- doc -- doc1.txt | | -- doc2.txt | | -- メモ.txt | | -- img -- 000001.jpg | -- 000002.jpg | -- 000003.jpg | -- memo.txt |
拡張子のないものはディレクトリです。
import
Python3.4以上を使う場合、あらゆるpath処理が”pathlib”一つで完結します。なので、importするのは”pathlib”のみでOKです。
1 |
from pathlib import Path |
カレント(現在位置)取得
以下のコードで、カレント(現在位置)を取得することができます。
1 2 |
current = Path() print(current) |
ディレクト設定
”/” で簡単にディレクトリやパスを繋げることができます。
1 2 3 4 5 6 7 |
dir_tmp = current / 'tmp' dir_doc = current / 'tmp' /'doc' dir_img = current / 'tmp' /'img' print(dir_tmp) print(dir_doc) print(dir_img) |
パスが存在するか確認
指定パスが存在するかどうか確認するには、以下のコードを使います。
1 2 3 4 5 |
check_path1 = current / 'tmp' / 'lib' check_path2 = current / 'tmp' / 'doc' / 'メモ.txt' print(check_path1.exists()) print(check_path2.exists()) |
True or False で有無が表示されます。
ファイル名取得(拡張子あり)
指定パスのファイル名を取得するに以下のコードを使います。
1 2 |
get_name1 = check_path2.name print(get_name1) |
ファイル名取得(拡張子なし)
拡張子が不要な場合は下記のコードを使います。
1 2 |
get_name2 = check_path2.stem print(get_name2) |
拡張子のみ取得
拡張子のみ取得することもできます。
1 2 |
get_extension = check_path2.suffix print(get_extension) |
ファイル・フォルダの一覧取得(リスト化)
以下のコードで指定パスの中に保存されているファイル・フォルダをまとめて取得(リスト化)できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
dir_tmp = current / 'tmp' dir_doc = current / 'tmp' /'doc' dir_img = current / 'tmp' /'img' print('======= dir_tmp ======') for path_tmp in dir_tmp.iterdir(): print(path_tmp) print('======= dir_doc ======') for path_doc in dir_doc.iterdir(): print(path_doc) print('======= dir_img ======') for path_img in dir_img.iterdir(): print(path_img) |
指定ファイルのみ取得(リスト化)
“img”ディレクトリ内にはtxtファイルとjpgファイルが混在していますが、下記のコードで、jpgファイルのみを取得(リスト化)することもできます。
1 2 |
list_img = list(dir_img.glob('**/*.jpg')) print(list_img) |
生成リストのパス取得
上記のコードで生成したリストから、以下のコードでパスを取得できます。
1 2 |
for get_path in list_img: print(get_path) |
これは、”pathlib”の使い方というより、リストとfor文の扱い方になります。
生成リストからファイル名のみ取得(拡張子あり)
パスなしのファイル名のみ取得することもできます。
1 2 |
for get_file in list_img: print(get_file.name) |
生成リストからファイル名のみ取得(拡張子なし)
拡張子が不要な場合は下記のコードを使います。
1 2 |
for get_file in list_img: print(get_file.stem) |
生成リストからファイル名のみ取得して拡張子を変更する
上記のコードでファイル名のみ取得して、任意の拡張子に付け替えることもできます。例えば、今回の場合は、jpg⇒pngに付け替えます。
1 2 3 |
for get_file in list_img: png_file = get_file.stem + '.png' print(png_file) |
こちらも”pathlib”の使い方というより、pythonの文字列操作です。
ソースコード内で定義したリストの拡張子が変わっただけで、実際のファイル拡張子は変わりません。
”はやぶさ”の技術ノート(動作確認)
今まで説明したソースコードをJupyter Notebookで作成して動作確認を行った、”はやぶさ”の技術ノートを公開します。勉強用の教材やチートシートとして活用できます。
まとめ
パス操作は、地味だけど重要な作業です。(パスを間違えて動かないとか、よくある。。)python3.4以上を使う場合は、”pathlib”モジュールを使ってスマートにパスを扱いましょう!
”pathlib”の使い方が分からなくなったときは、本記事をご活用くださいな。