ファイルが通常ファイルかディレクトリかを確認する — Python入門

パスが示すファイルが「通常ファイル」か「ディレクトリ」ファイルであるかを確認したい場合があります。これには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モジュールも是非使ってみてください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

・PM、SE、SIなどを20年以上経験
・ネットワークスペシャリスト、セキュリティスペシャリストなど複数の資格を保有

目次