ファイル・フォルダの確認
今回は最近よく使って、よく間違えているファイルやフォルダの確認に関して解説していきます。
Python上でファイルやフォルダ操作をするのに、取得したパスがファイルなのかそれともフォルダなのか判定したり、またそのパスが実際に存在しているかを確認することがそこそこあります。
ただ私自身、よく忘れて、よく間違えているので今回まとめておこうというのがこの記事を書こうと思ったきっかけです。
それでは始めていきましょう。
事前準備
今回はファイルかフォルダの判定や存在の確認をするので最初に練習用のファイル、フォルダを作成しておきます。
構造としてはこんな感じ。
test
├── dir1
├── dir2
├── text1.txt
└── text2.txt
「test」というフォルダの中に「dir1」、「dir2」というフォルダ、また「test1.txt」、「test2.txt」というファイルを作成しました。
今回はこれで色々と試していきましょう。
特定のフォルダ内のファイル・フォルダの取得:os.listdir()
まず基本的な点のおさらいです。
特定のフォルダ内(今回ならtestフォルダ)の中のファイル、フォルダの取得はosモジュールを使って「os.listdir(フォルダパス)」で行います。
import os
default_dir = 'test'
for dirfile in os.listdir(default_dir):
print(dirfile)
実行結果
.DS_Store
dir2
text1.txt
text2.txt
dir1
「.DS_Store」はMacOSで勝手に作成される隠しファイルなので無視してください。
「dir2」、「text1.txt」、「test2.txt」、「dir1」と順番は適当ですが、ファイル名、フォルダ名が取得することができました。
ここで注意することは、「os.listdir(フォルダパス)」で取得できるのは、あくまでも「ファイル”名”」、「フォルダ”名”」ということです。
決して「ファイル”パス”」、「フォルダ”パス”」ではないので注意してください(私がよくやるミスです)。
ということで次はパスの作成の方法をおさらいしましょう。
パスの連結:os.path.join()
パスを作成するには現在いるフォルダのパスとファイル名(もしくはフォルダ名)を連結させます。
この場合、文字列の結合で行うこともできますが、OSによって依存性が出てきてしまうのでosモジュールの「os.path.join(パス, ファイル名)」を使うことを強くオススメします。
ということでこんな感じです。
import os
default_dir = 'test'
for dirfile in os.listdir(default_dir):
print(os.path.join(default_dir, dirfile))
test/.DS_Store
test/dir2
test/text1.txt
test/text2.txt
test/dir1
今回は「相対パス」で表示してみました。
「絶対パス」でファイルやフォルダのパスを取得する方が多いと思いますが、その場合は「os.getcwd()」で現在のフォルダを取得するといいです。
このように作成したパスを使って、ファイルかフォルダかの判定やファイルやフォルダの存在確認を行います。
ファイルかどうかの判定:os.path.isfile()
ファイルかどうかの判定は「os.path.isfile(パス)」を使います。
これによりファイルの場合は「True」、ファイルではない場合は「False」が得られます。
import os
default_dir = 'test'
for dirfile in os.listdir(default_dir):
check_dirfile = os.path.join(default_dir, dirfile)
print(check_dirfile, os.path.isfile(check_dirfile))
実行結果
test/.DS_Store True
test/dir2 False
test/text1.txt True
test/text2.txt True
test/dir1 False
実際はif文を使って条件分岐させ、ファイルだけ取得するという使い方が多いでしょう。
import os
default_dir = 'test'
for dirfile in os.listdir(default_dir):
check_dirfile = os.path.join(default_dir, dirfile)
if os.path.isfile(check_dirfile):
print(f'{check_dirfile} is a file.')
実行結果
test/.DS_Store is a file.
test/text1.txt is a file.
test/text2.txt is a file.
フォルダかどうかの判定:os.path.isdir()
フォルダかどうかの判定の場合は「os.path.isdir(パス)」を使います。
これによりフォルダの場合は「True」、フォルダではない場合は「False」が得られます。
import os
default_dir = 'test'
for dirfile in os.listdir(default_dir):
check_dirfile = os.path.join(default_dir, dirfile)
print(check_dirfile, os.path.isdir(check_dirfile))
実行結果
test/.DS_Store False
test/dir2 True
test/text1.txt False
test/text2.txt False
test/dir1 True
こちらも実際にはif文を使って条件分岐させ、フォルダだけ取得するという使い方が多いことでしょう。
import os
default_dir = 'test'
for dirfile in os.listdir(default_dir):
check_dirfile = os.path.join(default_dir, dirfile)
if os.path.isdir(check_dirfile):
print(f'{check_dirfile} is a directory.')
実行結果
test/dir2 is a directory.
test/dir1 is a directory.
ファイルやフォルダの存在確認:os.path.exists()
あるパスがファイルやフォルダとして存在していることを確認するには「os.path.exists(パス)」を用います。
testフォルダの中に「dir1」、「test1.txt」、「dir3」、「test3.txt」が存在するか確認してみましょう。
import os
check_exist = ['dir1', 'text1.txt', 'dir3', 'text3.txt']
for check_dirfile_name in check_exist:
check_dirfile_path = os.path.join(default_dir, check_dirfile_name)
print(check_dirfile_path, os.path.exists(check_dirfile_path))
実行結果
test/dir1 True
test/text1.txt True
test/dir3 False
test/text3.txt False
「dir1」、「text1.txt」は存在するので「True」が、「dir3」、「text3.txt」は存在しないので「False」が表示されました。
今回、ファイルかどうかの判定「os.path.isfile()」、フォルダかどうかの判定「os.path.isdir()」、ファイル・フォルダの存在確認「os.path.exists()」を見てきましたが、一緒に解説したのには意味があります。
これらは引数に「パス」を要求するのですが、よく間違えるのはパスにせず、ファイル名やフォルダ名のまま値を渡してしまい、全て「False」になってしまうということことがあります。
つまりこんな感じです。
import os
check_exist = ['dir1', 'text1.txt', 'dir3', 'text3.txt']
for check_dirfile_name in check_exist:
print(check_dirfile_name, os.path.exists(check_dirfile_name))
dir1 False
text1.txt False
dir3 False
text3.txt False
このように表示させていると、「dir1」、「text1.txt」は存在するのになぜ「False」になるんだろうと小一時間悩むというのがたまにあります。
そんな時は「パス」を引数に渡すということを思い出してもらえるといいかと思います(自戒の念を込めて)。
次回は同じくファイル操作の一環として、ファイル名のソートの仕方を紹介します。
ではでは今回はこんな感じで。
コメント