例外なくファイルが存在するかどうかを確認するにはどうすればよいですか?

2008年09月17日に質問されました。  ·  閲覧回数 4.1M回  ·  ソース

spence91 picture
2008年09月17日

tryステートメントを使用せずに、ファイルが存在するかどうかを確認するにはどうすればよいですか?

回答

rslite picture
2008年09月17日
5398

チェックしている理由がif file_exists: open_it()ようなことをするためである場合、それを開こうとする試みの周りにtryを使用する方が安全です。 チェックしてから開くと、ファイルが削除または移動されるか、チェックしてから開こうとするまでの間に何かが発生するリスクがあります。

ファイルをすぐに開く予定がない場合は、 os.path.isfile使用できます。

パスが既存の通常のファイルである場合は、 True返します。 これはシンボリックリンクに従うため、 islink()isfile()の両方が同じパスに対してtrueになる可能性があります。

import os.path
os.path.isfile(fname) 

それがファイルであることを確認する必要がある場合。

Python 3.4以降、 pathlibモジュールはオブジェクト指向のアプローチを提供します(Python 2.7ではpathlib2にバックポートされています)。

from pathlib import Path

my_file = Path("/path/to/file")
if my_file.is_file():
    # file exists

ディレクトリを確認するには、次の手順を実行します。

if my_file.is_dir():
    # directory exists

Pathオブジェクトがファイルであるかディレクトリであるかに関係なく存在するかどうかを確認するには、 exists()使用します。

if my_file.exists():
    # path exists

tryブロックでresolve(strict=True)を使用することもできます。

try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists
PierreBdR picture
2008年09月17日
2224

os.path.exists関数があります:

import os.path
os.path.exists(file_path)

これにより、ファイルとディレクトリの両方に対してTrueが返されますが、代わりに使用できます。

os.path.isfile(file_path)

特にファイルかどうかをテストします。 シンボリックリンクに従います。

bortzmeyer picture
2008年09月17日
1028

isfile()とは異なり、 exists()はディレクトリに対してTrueを返します。 したがって、プレーンファイルのみが必要かディレクトリも必要かによって、 isfile()またはexists()ます。 簡単なREPL出力を次に示します。

>>> os.path.isfile("/etc/password.txt")
True
>>> os.path.isfile("/etc")
False
>>> os.path.isfile("/does/not/exist")
False
>>> os.path.exists("/etc/password.txt")
True
>>> os.path.exists("/etc")
True
>>> os.path.exists("/does/not/exist")
False
Paul picture
2008年09月17日
652
import os.path

if os.path.isfile(filepath):
Yugal Jindle picture
2012年01月16日
369

使用os.path.isfile()os.access()

import os

PATH = './file.txt'
if os.path.isfile(PATH) and os.access(PATH, os.R_OK):
    print("File exists and is readable")
else:
    print("Either the file is missing or not readable")
benefactual picture
2008年09月17日
308
import os
os.path.exists(path) # Returns whether the path (directory or file) exists or not
os.path.isfile(path) # Returns whether the file exists or not
CristiFati picture
2017年06月21日
254

考えられるほとんどすべての方法が既存の回答(少なくとも1つ)にリストされていますが(たとえば、 Python 3.4固有のものが追加されました)、すべてをグループ化しようとします。

:これから投稿するPython標準ライブラリコードはすべてバージョン3.5.3に属しています。

問題の説明

  1. ファイル(議論の余地がある:フォルダ(「特別な」ファイル)も)の存在を確認してください
  2. try /ただし、 / else / finallyブロックは使用しないでください

考えられる解決策

  1. [Python 3]:os.path。 os.path.isfileos.path.isdir os.path.isfileos.path.isdiros.path.lexistsなどの他の関数ファミリーメンバーも確認してください)

    os.path.exists(path)
    

    パスが既存のパスまたは開いているファイル記述子を参照している場合は、 True返します。 壊れたシンボリックリンクに対してFalseを返します。 一部のプラットフォームでは、パスが物理的に存在していても、要求されたファイルでos.stat()を実行する権限が付与されていない場合、この関数はFalse返すことがあります。

    すべて良好ですが、インポートツリーに従う場合:

    • os.path - posixpath.pyntpath.py

      • genericpath.py 、行〜#20 +

        def exists(path):
            """Test whether a path exists.  Returns False for broken symbolic links"""
            try:
                st = os.stat(path)
            except os.error:
                return False
            return True
        

    [Python 3]の周りのブロックを除いて/試してみてください:os。 try / freeを除いてですが、フレームスタックの下位には(少なくとも)そのようなブロックがos.path.isfileを含む)にも当てはまります。

    1.1。 [Python 3]:パス。

    • これは、パスを処理するためのより洗練された(そしてより多くのPython ic)方法ですが、
    • 内部的にはまったく同じことを行います( pathlib.py 、行〜#1330 ):

      def is_file(self):
          """
          Whether this path is a regular file (also True for symlinks pointing
          to regular files).
          """
          try:
              return S_ISREG(self.stat().st_mode)
          except OSError as e:
              if e.errno not in (ENOENT, ENOTDIR):
                  raise
              # Path doesn't exist or is a broken symlink
              # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
              return False
      
  2. [Python 3]:ステートメントコンテキストマネージャーを使用。 どちらか:

    • 一つ作る:

      class Swallow:  # Dummy example
          swallowed_exceptions = (FileNotFoundError,)
      
          def __enter__(self):
              print("Entering...")
      
          def __exit__(self, exc_type, exc_value, exc_traceback):
              print("Exiting:", exc_type, exc_value, exc_traceback)
              return exc_type in Swallow.swallowed_exceptions  # only swallow FileNotFoundError (not e.g. TypeError - if the user passes a wrong argument like None or float or ...)
      
      • そしてその使用法- os.path.isfile動作を複製します(これは単なるデモンストレーション目的であり、本番用にそのようなコードを記述しようとしないでください):

        import os
        import stat
        
        
        def isfile_seaman(path):  # Dummy func
            result = False
            with Swallow():
                result = stat.S_ISREG(os.stat(path).st_mode)
            return result
        
    • [Python 3]:contextlibを使用します。 例外を選択的に抑制するために特別に設計されました


    しかし、彼らは除く試しオーバーラッパー/のように見える// finallyブロック、など[Pythonの3]:文状態:

    これにより、一般的な試行が可能になります...ただし...最終的に使用パターンをカプセル化して再利用しやすくします。

  3. ファイルシステムトラバーサル関数(および結果から一致するアイテムを検索する)

Cody Piersall picture
2014年02月08日
178

Pythonの3.4+は、オブジェクト指向のパスのモジュールがあります: pathlibを。 この新しいモジュールを使用して、次のようなファイルが存在するかどうかを確認できます。

import pathlib
p = pathlib.Path('path/to/file')
if p.is_file():  # or p.is_dir() to see if it is a directory
    # do stuff

ファイルを開くときにtry/exceptブロックを使用できます(通常は使用する必要があります)。

try:
    with p.open() as f:
        # do awesome stuff
except OSError:
    print('Well darn.')

pathlibモジュールには、便利なグロブ、ファイルの所有者の確認、簡単なパス結合など、すばらしい機能がたくさんあります。チェックする価値があります。 古いPython(バージョン2.6以降)を使用している場合でも、pipを使用してpathlibをインストールできます。

# installs pathlib2 on older Python versions
# the original third-party module, pathlib, is no longer maintained.
pip install pathlib2

次に、次のようにインポートします。

# Older Python versions
import pathlib2 as pathlib
un33k picture
2013年06月27日
158

これは、ファイルが存在するかどうかを確認する最も簡単な方法です。 あなたがチェックすると、ファイルが存在していたという理由だけ保証するものではありません。

import os
fname = "foo.txt"
if os.path.isfile(fname):
    print("file does exist at this time")
else:
    print("no such file exists at this time")
pkoch picture
2009年11月04日
129

tryステートメントを優先します。 より良いスタイルと見なされ、競合状態を回避します。

私の言葉を信じないでください。 この理論には多くの支持があります。 ここにいくつかあります: