【Python】osモジュールでファイルの有無や絶対パスを確認する


投稿日 2023年7月16日 >> 更新日 2023年12月5日

概要

Python標準パッケージのosモジュールを使用して特定のファイルの存在有無や、実行ファイルの絶対パスの確認等を実行します。
open関数のようなファイルを読み込むツールを使用した時、ファイルをしっかり読み込みたい時に活用できる操作です。

実行環境

実行環境
Windows Subsystem for Linux 2
Python 3.7.0

os.path.isfileで特定のファイルの有無を確認する

例えば、開発環境と本番環境では読み込もうとするファイルの位置が変わってしまったりして、特定のファイルを読み込む事ができないといった事があります。

その際に、異なる環境下であってもファイルの有無を確認する処理を行うには「os.path.isfile」でファイル名を指定します。

# file_path.py

import os


file_name = 'file_1.txt'

if os.path.isfile(file_name):
    print("有り")
else:
    print("無し")
# 無し

「os.path.isfile」の戻り値はブール値です。

os.path.abspathでファイルの絶対パスを表示する

特定のファイルの位置(パス)を確認したい場合は「os.path.abspath」にファイル名を指定します。

実行しているPythonファイル自身の絶対パスを確認したい場合は「__file__」を指定します。

# file_path.py

import os

print(os.path.abspath('file_1.txt')
# /mnt/c/Users/Documents/file_1.txt

print(os.path.abspath(__file__))
# /mnt/c/Users/Documents/file_path.py

「os.path.abspath」に指定したファイル名は存在しなくても、指定したファイル名を加えた絶対パスを返します。

os.path.dirnameでファイルが配置されているディレクトリ名を取得する

実行しているファイルのディレクトリや特定のファイルのディレクトリを取得したい場合はos.path.dirnameを使用します。

# file_path.py

import os


print(os.path.dirname('file_1.txt'))
# 

print(os.path.dirname(__file__))
# .

ファイル名のみ渡した場合は何も取得できませんが相対パスや絶対パスを渡した場合は最下層のディレクトリ名を取得します。

絶対パスとして取得したい場合は、「os.path.abspath」と組み合わせると取得できます。

# file_path.py

import os

file_1 = os.path.abspath('file_1.txt')
print(os.path.dirname(file_1))
# /mnt/c/Users/Documents

my_file = os.path.abspath(__file__)
print(os.path.dirname(my_file))
# /mnt/c/Users/Documents

「os.getcwd」を使用すると、実行しているディレクトリ名までの絶対パスを取得することができます。

# file_path.py

import os


print(os.getcwd())
# /mnt/c/Users/Documents

os.path.joinでディレクトリやファイルのパスの結合

「os.path.join」では第一引数と第二引数に指定した値を結合したパスとして取得することができます。

# file_path.py

import os


print(os.path.join('dirname1', 'dirname2'))
# dirname1/dirname2

print(os.path.join('dirname1', 'file_1.txt'))
# dirname1/file_1.txt

特定のディレクトリに存在するファイルをopen関数のようなツールに読み込ませたい時に使用できます。

この記事で現れたモジュールを使って実装してみると以下のような処理を行えます。

# file_path.py

import os

file_name = 'file_1.txt'

if not os.path.isfile(file_name):
    abs_path = os.getcwd()
    file_name = os.path.join(abs_path, 'file_1.txt')

with open('file_name', 'r') as f:
    file_data = f.read()

上記の処理内容は、ローカル環境での「file_1.txt」の位置と本番環境(パッケージ等)での「file_1.txt」の位置がopen関数を使う際に異なってしまうパスを渡したい場合に使います。

もちろん「file_1.txt」が存在していなければopen関数でエラーとなるでしょう。

それでは以上となります。

最後までご覧いただきありがとうございました。