Python

【Python】ファイルのパスを取得する方法

この記事では、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 のファイルのみマッチします。