Python

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

この記事では、Pythonのコード内からファイルのパスを取得する方法を解説します。パスを取得することで任意の場所にファイルを作成したりできます。それでは、パスの取得方法を見ていきましょう!

実行中のファイルのパスを取得する

実行中のファイルのパスを取得するには__file__を使います。

使用するファイルのパス

/Users/user/Desktop/Python/file.py

__file__には実行中のファイルのパスが格納されていますがバージョンによって挙動が異なる。

print(f'__file__: {__file__}')

Python3.8以下では、Pythonコマンドで実行する際に指定したパスが返されます。

$ python3 Desktop/Python/file.py
__file__: Desktop/Python/file.py

Python3.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」のファイルのみマッチします。

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』