パスが示すファイルが「通常ファイル」か「ディレクトリ」ファイルであるかを確認したい場合があります。これにはos.pathモジュールを使う方法とpathlibモジュールを使う2つの方法があります。
また、ファイルがシンボリックリンクの場合、それが「通常ファイル」や「ディレクトリ」を指しているのか、シンボリックリンク自体であるかを区別する方法についても確認します。
なお、ここでの例はMac環境で次のファイルを使って動作の確認をしています。
$ ls -l
total 0
drwxr-xr-x@ 4 taro staff 128 11 16 2021 dir1
-rw-r--r-- 1 taro staff 0 8 28 16:44 file1
lrwxr-xr-x 1 taro staff 8 8 28 16:43 linkdir -> /var/tmp
lrwxr-xr-x 1 taro staff 19 8 28 16:43 linkfile -> /var/tmp/liked_file
pathlibモジュールの使い方は次の記事も参照ください。
通常ファイルかどうか確認する
ファイルには「通常ファイル」、「ディレクトリファイル」、「シンボリックリンク」の他に、ブロック型特殊ファイルや文字型特殊ファイルなどいくつかの種類があります。
ここではパスが示すファイルが「通常ファイル」であるかどうか確認する方法を紹介します。
os.path.isfile()関数
ファイルが通常ファイルかどうか確認するにはos.path.isfile()を使います。引数にはファイルへのパスを文字列で指定します。
>>> import os
>>> os.path.isfile('file1')
True
>>> os.path.isfile('linkfile')
True
isfile()はパスが示すファイルが存在し、かつ「通常ファイル」であればTrueを返します。isfile()はリンクを辿るので、ファイルへのシンボリックリンクに対してもTrueを返します。
ファイルが存在しないか通常ファイル以外(ここではディレクトリあるいはディレクトリへのシンボリックリンク)の場合はFalseを返します。
>>> os.path.isfile('foo')
False
>>> os.path.isfile('dir1')
False
>>> os.path.isfile('linkdir')
False
pathlibモジュールのis_file()メソッド
pathlibモジュールで定義されている具象パスクラスのis_file()メソッドを使っても、同様に確認することができます。
具象パスクラスのis_file()メソッドも、ファイルが存在し、かつ「通常ファイル」であればTrueを返します。このメソッドもリンクを辿るので、ファイルへのシンボリックリンクに対してもTrueを返します。それ以外の場合はFalseを返します。
>>> from pathlib import Path
>>> Path('file1').is_file()
True
>>> Path('linkfile').is_file()
True
>>> Path('foo').is_file()
False
>>> Path('dir1').is_file()
False
>>> Path('linkdir').is_file()
False
ディレクトリかどうか確認する
パスが示すファイルがディレクトリ(ファイル)であるかどうか確認する方法も2つ紹介しましょう。
os.path.isdir()関数
os.path.isdir()は、引数に渡されたパスのファイルが存在し、かつディレクトリであればTrueを返します。isdir()もリンクを辿るので、ディレクトリへのシンボリックリンクに対してTrueを返します。
>>> os.path.isdir('dir1')
True
>>> os.path.isdir('linkdir')
True
ファイルが存在しない、あるいはディレクトリ以外であればFalseを返します。
>>> os.path.isdir('foo')
False
>>> os.path.isdir('file1')
False
>>> os.path.isdir('linkfile')
False
pathlibモジュールのis_dir()メソッド
pathlibモジュールで定義されている具象パスクラスのis_dir()メソッドを使っても、同様に確認することができます。
>>> Path('dir1').is_dir()
True
>>> Path('linkdir').is_dir()
True
>>> Path('foo').is_dir()
False
>>> Path('file1').is_dir()
False
>>> Path('linkfile').is_dir()
False
具象パスクラスのis_dir()メソッドも、ファイルが存在し、かつディレクトリであればTrueを返します。このメソッドもリンクを辿るので、ディレクトリへのシンボリックリンクに対してもTrueを返します。それ以外の場合はFalseを返します。
シンボリックリンクかどうか確認する
前述した確認方法ではパスが示すファイルがシンボリックリンクであるかは確認できませんでしたが、パスが示すファイルがシンボリックリンク自体であるかを確認することもできます。
os.path.islink()関数
パスが示すファイルがシンボリックリンクかどうかを確認するにはos.path.islink()を使います。islink()は引数パスのファイルが存在し、かつシンボリックリンクであればTrueを返します。
>>> os.path.islink('linkfile')
True
>>> os.path.islink('linkdir')
True
ファイルが存在しない、あるいはシンボリックリンク以外であればFalseを返します。
>>> os.path.islink('foo')
False
>>> os.path.islink('file1')
False
>>> os.path.islink('dir1')
False
pathlibモジュールのis_symlink()メソッド
pathlibモジュールで定義されている具象パスクラスのis_symlink()メソッドを使っても、同様に確認することができます。
>>> Path('linkdir').is_symlink()
True
>>> Path('linkdir').is_symlink()
True
>>> Path('foo').is_symlink()
False
>>> Path('file1').is_symlink()
False
>>> Path('dir1').is_symlink()
False
具象パスクラスのis_symlink()メソッドも、ファイルが存在し、かつシンボリックリンクであればTrueを返します。それ以外の場合はFalseを返します。
まとめ
pathlibモジュールはPython 3.4から追加された比較的新しいモジュールです。パスをオブジェクトとして扱い、慣れると便利なので、今後はpathlibモジュールも是非使ってみてください。