Pythonにファイルまたはフォルダが存在するかどうかを確認する7つの方法

公開: 2021-06-16

Python標準ライブラリには、開発者が問題を解決するために必要な機能のほとんどが含まれています。 このチュートリアルでは、組み込みモジュールのみを使用してファイルまたはディレクトリの存在を確認するさまざまな方法を学習します。

ファイルまたはスクリプトが正しい場所にあるかどうかを確認することは、CLIプログラムにとって非常に重要です。 実行時に特定のファイルが配置されていないと、プログラムが役に立たなくなる可能性があります。

今日のチュートリアルでは、ファイルまたはフォルダーがPythonに存在するかどうかを確認する簡単な方法をいくつか学びます。

始める前に

以下のコマンドを実行する前に、システムにPython3がインストールされていることを確認してください。 ターミナルを開き、次のコマンドを入力します。

 python --version # Python 3.9.5, my result

2.xバージョンを入手した場合は、「python3」コマンドを使用する必要があります。 Python 3がインストールされていない場合は、Pythonインストールガイドを確認してください。

このチュートリアルではいくつかのテストファイルを使用するため、必ず次のファイルを作成してください。

 touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txt

コマンドは、上記で再生するファイル、テストディレクトリ、およびtestingdirectory内部に別のファイルを作成します。 コンテンツを読み取る必要がないため、ファイルを空にすることができます。

注: Windowsを使用している場合は、グラフィカルファイルマネージャーを使用してそのファイルの単純なファイル構造を設定します。

最後に、インタラクティブなPythonシェルとしてIpythonを使用します。これにより、操作に適したインターフェイスが提供されます。 これは単なる商品であるため、厳密には必要ありません。

 pip install ipython

これを行うと、 ipythonと入力するだけで美しいPythonシェルにアクセスできるようになります。

Python3.9を実行するIpythonインタラクティブシェル

これで準備が整いました。Pythonにフォルダまたはファイルが存在するかどうかを確認する方法を詳しく見ていきましょう。

試して、開いて、除外する

これは最も簡単なオプションです。 存在しないファイルを開こうとすると、PythonはFileNotFoundErrorを発生させます。

 In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

これを利用して、探しているファイルが存在しない場合の例外を処理できます。

 In [2]: try: ...: file = open('im-not-here.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\' exist') ...: exit() ...: Sorry the file we're looking for doesn't exist

上記のコードでは、カスタムメッセージを出力し、ファイルが存在しない場合はプログラムの実行を停止しています。

exit()関数が、例外が発生した場合にのみ実行されることに注意してください。 探しているファイルが実際に存在するとどうなるか見てみましょう。

 In [2]: try: ...: file = open('testfile.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

ファイルを開いた直後にファイルを閉じる方法に注意してください。 Pythonのドキュメントによると、これは良い習慣と考えられています。

<span class="pre">with</span>キーワードを使用せずに<span class="pre">file.write()</span>を呼び出すか、 <span class="pre">file.close()</span>呼び出し<span class="pre">file.close()</span>、プログラムが正常に終了した場合でも、 <span class="pre">file.write()</span>の引数がディスクに完全に書き込まれない可能性があります。

ファイルに書き込んでいない場合でも、複数のパフォーマンスの問題が発生する可能性があるため、ファイルを閉じることを強くお勧めします。

自分でファイルを閉じたくない場合は、 withコンテキストマネージャーを使用できます。 リソースを正確に割り当てて解放するため、ファイルを閉じる必要はありません。

 In [3]: try: ...: with open('testfile.txt') as file: ...: print(file) ...: # No need to close the file ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

この方法は、ファイルに書き込むときに非常に便利ですが、ファイルが存在するかどうかを確認するだけの場合は非効率的です。 これを達成するために他のオプションに飛び込みましょう。

os.path.exists()

osモジュールは、オペレーティングシステムと対話するための複数の機能を提供します。 ファイルまたはフォルダーが存在するかどうかを確認するには、パスを使用できます ファイルまたはディレクトリへのパスを引数として受け入れるexists()関数。 パスの存在に基づいてブール値を返します。

注:パスは、ファイルシステム内のファイルまたはディレクトリの一意の場所です。

Pythonでは、os.pathサブモジュールには、ファイルパスで動作するように専用に設計された関数が含まれています。 これらの関数はすべて、パス引数を文字列またはバイトとして受け入れます。たとえば、次のように絶対パスを使用することを決定できます。

 /home/daniel/.bashrc

または、スクリプトを実行しているディレクトリに応じて、相対パスを使用します。

 .bashrc # Running the script in my home folder

テストファイルが配置されているディレクトリで実行されているos.path.exists()関数を使用した複数の例を次に示します。

 In [1]: import os In [2]: os.path.exists('testfile.txt') Out[2]: True In [3]: os.path.exists('testdirectory') Out[3]: True In [4]: os.path.exists('hey-i-dont-exist') Out[4]: False

ご覧のとおり、 testfile.txtファイルとtestdirectoryフォルダーを使用してテストする場合はTrueを返し、ファイルが存在しない場合はFalseを返します。

os.path.isfile()

(ディレクトリではなく)ファイルの存在を証明したいだけの場合は、 os.path.isfile()関数を呼び出します。

 In [1]: import os In [2]: os.path.isfile('testfile.txt') Out[2]: True In [3]: os.path.isfile('testdirectory/') Out[3]: False In [4]: os.path.isfile('i-dont-even-exist') Out[4]: False In [5]: os.path.isfile('testdirectory/otherfile.txt') Out[5]: True

注: UNIXでは、すべてのディレクトリがスラッシュ(/)で終わりますが、Windowsではバックスラッシュ(\)を使用します。

上記のコードでは、 isfile()関数が2回Falseを返すので、その理由を見てみましょう。

  • testdirectory/はディレクトリであるため、ファイルとは見なされません。 Linuxではすべてがファイル記述子であるため、これは絶対に当てはまりませんが、Pythonは便宜上、ディレクトリを異なる方法で処理します(ディレクトリを開こうとすると、 IsADirectoryErrorが発生します)
  • i-dont-even-existは、皮肉なことに存在しないファイルを指しています

os.path.isdir()

ディレクトリが正しい場所にあることを確認する場合は、 os.path.isdir()関数を使用する必要があります。この関数は、指定されたパスがディレクトリを指している場合にのみTrueを返します。

 In [1]: import os In [2]: os.path.isdir('testfile.txt') Out[2]: False In [3]: os.path.isdir('testdirectory') Out[3]: True In [4]: os.path.isdir('anotherfile.txt') Out[4]: False

パスが存在するファイルを指している場合でも、上記の例でFalseが返されることに注意してください。

グロブ

globモジュールは、Unixシェルのようなパターンで動作する関数を提供します(したがって、Windowsでは正しく動作しません)。 ファイルが現在のディレクトリ内のパターンと一致するかどうかを確認するには、glob.glob()関数を使用できます。

 In [1]: import glob In [2]: glob.glob('testfile.txt') Out[2]: ['testfile.txt'] In [3]: glob.glob('testdirectory') Out[3]: ['testdirectory']

上記のコードでは、glob関数に渡されるパターンは、テストファイルとディレクトリへのパスを表す通常の文字列です。 両方のパスが存在するため、関数は一致するパス名を含むリストを返します。

注:パターンが一致しなかった場合は、空のリストが表示されます。

パターンをglob関数に渡すことができることを考慮して、その主な利点のいくつかをテストしてみませんか?

以下のコードは、拡張子がそれぞれ.txt.pyのすべてのファイルパスを取得します。

 In [4]: glob.glob('*.txt') Out[4]: ['testfile.txt'] In [5]: glob.glob('*.py') Out[5]: ['pathlib-exists.py', 'list-dir.py', 'glob-file.py', 'open-except.py', 'subprocess-test.py', 'isfile.py', 'exists.py', 'isdir.py']

パスクラスの使用

Pathクラスは、ファイルパスをオブジェクトとして操作するためのクリーンなインターフェイスを提供するため、パスを操作するための最良の方法の1つです。

ケーキのチェリーは、パスインスタンスが特定のパスに関する情報を取得するために必要なすべてのメソッドを持っているということです。 これには、以前のオプションと同様の機能が含まれます。

注: pathlibライブラリを使用するには、Python3.4以降が必要です。

使用するPathメソッド:

  • Path()。exists()
  • Path()。is_file()
  • Path()。is_dir()

パスが存在するかどうかを確認します

In [1]: from pathlib import Path In [2]: Path('testfile.txt').exists() Out[2]: True In [3]: Path('im-not-here.txt').exists() Out[3]: False In [4]: Path('testdirectory').exists() Out[4]: True

os.path.exists()と同じように機能します。

パスがファイルを指しているかどうかを確認します

In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: False

os.path.isfile()と同等です。

パスがディレクトリを指しているかどうかを確認します

In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: True

os.path.isdir()に対応します。

サブプロセス

サブプロセスモジュールが好きな場合は、このオプションについて知っておく必要があります。 testコマンドを使用して、ファイルまたはフォルダーが存在するかどうかを判別できます。

注: testコマンドはUnixでのみ機能します。

次のテストフラグは、ジョブを完了させます。

  • test -e:パスが存在するかどうかを確認します
  • test -f:ファイルが存在するかどうかを確認します
  • test-d:フォルダが存在するかどうかを確認します

より多くのテストフラグに飛び込みたい場合は、以下を実行してマニュアルを読むことができます。

 man test

サブプロセスを使用したパスの確認:

以下のコードは、サブプロセスの戻りコードを0と比較することにより、パスが存在するかどうかを判別します。

Linuxでは、プロセスがうまくいった場合はゼロを返し、うまくいかなかった場合は他のコードを返すことを忘れないでください。

 In [1]: from subprocess import run In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0 Out[2]: True In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0 Out[3]: False

最初のステートメントでは、サブプロセスモジュールをインポートしてから、run関数を使用して、その戻りコードを取得しています。

サブプロセスを含むファイルの存在を確認する

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: False

サブプロセスでディレクトリをチェックする:

 In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: True

このオプションはより多くのリソースを消費し、私たちはそれから何の利点も得られないため、このオプションを使用することはお勧めできません。

総括する

Pythonは、OSと対話することによってプロセスを自動化するために最も使用されているプログラミング言語の1つです。 それを使ってできるクールなことの1つは、ファイルまたはフォルダーが存在するかどうかを確認することです。

そのための最も簡単な方法は次のとおりです。

  • ファイルの例外をすぐに開いて処理する
  • os.pathまたはpathlibモジュールのexists()関数を使用します。

このチュートリアルでは、次のことを学びました。

  • ファイルを開いて、ファイルが存在しない場合に例外を処理する方法
  • パスの意味
  • os.pathサブモジュールがファイルまたはフォルダーの存在をチェックするために提供する3つの異なる機能
  • Unixはスラッシュ(/)を使用し、Windowsはバックスラッシュ(\)を使用します

次に読む:Pythonのサブプロセスとは何ですか? 【5つの使用例】