この記事では、Pythonのコード内からファイルのパスを取得する方法を解説します。
パスを取得することで任意の場所にファイルを作成したりできます。
それでは、パスの取得方法を見ていきましょう!
実行中のファイルのパスを取得する
実行中のファイルのパスを取得するには、__file__を使います。
ここでは、以下のパスのファイルを編集・実行します。
/Users/user/Desktop/Python/file.py
__file__には、Pythonコマンドで指定したパスが格納されます。
print(f'__file__: {__file__}')
試しにパスを指定し、実行してみます。
$ python3 Desktop/Python/file.py
__file__: Desktop/Python/file.py
このように、__file__にはPython3コマンドの後に指定したパスが格納されているのがわかります。
パスからファイル名のみを抜き出す
パスからファイル名を取得するには、os.pathモジュールのbasename()を使います。
import os
print(os.path.basename(__file__))
実行結果
file.py
パスから絶対パスを取得する
os.pathモジュールのabspath()を使うことで、パスから絶対パスを取得できます。
試しにファイル名から絶対パスを取得して出力してみます。
import os
print(os.path.abspath(os.path.basename(__file__)))
実行結果
/Users/user/Desktop/Python/file.py
パスからディレクトリ名を取得する
os.pathモジュールのdirname()を使うことで、パスからディレクトリ名を取得できます。
試しにファイル名から絶対パスを取得して出力してみます。
import os
print(os.path.abspath(os.path.basename(__file__)))
実行結果
/Users/user/Desktop/Python/file.py
カレントディレクトリの絶対パスの取得
osモジュールのgetcwd()を使うことで、カレントディレクトリの絶対パスが取得できます。
import os
print(os.getcwd())
実行結果
/Users/user/Desktop/Python
ユーザーが現時点で作業を行っているディレクトリのこと。作業フォルダとも呼ばれる。
ディレクトリに格納されているファイル名を取得
osモジュールのwalk関数を使うことで、引数に指定したディレクトリに格納されている全てのファイル名とディレクトリ名を取得することができます。
import os
os.walk(パス)
指定したディレクトリ内にディレクトリが格納されている場合、その格納されているディレクトリの中身も取得されます。
サンプル
以下のようなファイルがあった場合、
※ libディレクトリとmain.pyは同じディレクトリ内に格納されています。
この時、main.pyからlibディレクトリの中身を表示してみます。
main.py
import os
for d, s, f in os.walk('lib'):
print(f'd: {d}')
print(f's: {s}')
print(f'f: {f}\n')
実行結果
d: lib
s: ['text']
f: ['file2.py', 'file1.py']
d: lib/text
s: []
f: ['text.txt']
dはディレクトリ名、sはサブディレクトリ名、fはファイル名を取得しています。
このように、指定したディレクトリに格納されているファイル名とサブディレクトリ名を取得できます。
サブディレクトリ内のファイル名も再帰的に取得できます。
正規表現でファイル名を取得する
globモジュールのglob()を使うことで、pathname引数に指定したパターンにマッチしたファイル名を取得できます。
import glob
glob.glob(pathname, *, recursive=False)
サンプル
例えば、以下のようなファイルがあったとして、

この時、main.pyからdirディレクトリ内に格納されている全てのファイル名を取得してみます。
main.py
import glob
import os
# ディレクトリのパス
dir_path = 'dir'
# dir/*
path = os.path.join(dir_path, '*')
print(glob.glob(path))
実行結果
['dir/file.py', 'dir/text1.txt', 'dir/text2.txt']
ディレクトリ内の全てのファイル名を取得できました。
特定のファイルのみを取得する
先ほどのdirディレクトリからテキストファイルのみを取得してみます。
import glob
import os
dir_path = 'dir'
# dir/*.txt
path = os.path.join(dir_path, '*.txt')
print(glob.glob(path))
実行結果
['dir/text1.txt', 'dir/text2.txt']
「*」に「.txt」を付けました。これにより、拡張子が「.txt」のファイルのみマッチします。