この記事では、Pythonのコード内からファイルのパスを取得する方法を解説します。
パスを取得することで任意の場所にフォルダやファイルを作成したりできます。また、パスからファイル名を抜き出したり、絶対パスを取得したりすることも可能です。
それでは、パスの色々な取得方法を見ていきましょう!
実行中のファイルのパスを取得する
実行中のファイルのパスを取得するには、__file__
属性から参照できます。
/Users/user/Desktop/Python/file.py
__file__
には、実行中のファイルのパスが格納されています。
print(f'__file__: {__file__}')
Python 3.8以下では、Pythonコマンドで実行する際に指定したパスが返されます。
$ python3 Desktop/Python/file.py
__file__: Desktop/Python/file.py
Python 3.9からは、必ず絶対パスが返されるようになった。
$ python3 Desktop/Python/file.py
__file__: /Users/user/Desktop/Python/file.py
パスからファイル名のみを抜き出す
パスからファイル名を取得するには、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.dirname(__file__))
実行結果
/Users/user/Desktop/Python
カレントディレクトリの絶対パス
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
のファイルのみマッチします。
まとめ
この記事では、Pythonでパスを取得する方法を解説しました。
うまいことパスを取得することで特定の拡張子のファイルをまとめて処理したりできます。walk
関数やglob()
は便利なのでぜひ使ってみてください。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ