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

5869
spence91 2008-09-18 02:55.

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

30 answers

5398
rslite 2008-09-18 02:57.

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

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

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

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

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

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

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

また、使用することができますresolve(strict=True)tryブロック:

try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists
2222
PierreBdR 2008-09-18 02:57.

あなたはos.path.exists機能を持っています:

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

これはTrueファイルとディレクトリの両方に戻りますが、代わりに使用できます

os.path.isfile(file_path)

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

1028
bortzmeyer 2008-09-18 05:01.

とは異なり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
651
Paul 2008-09-18 02:55.
import os.path

if os.path.isfile(filepath):
369
Yugal Jindle 2012-01-16 19:57.

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")
307
benefactual 2008-09-18 02:56.
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
254
CristiFati 2017-06-21 09:28.

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

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

問題の説明

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

考えられる解決策

  1. [Python 3]:os.path。存在するパス)(またのような他の機能ファミリーのメンバーを確認しos.path.isfileos.path.isdiros.path.lexistsわずかに異なる行動のために)

    os.path.exists(path)
    

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

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

    • 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。statpath、*、dir_fd = None、follow_symlinks = True)。したがって、コードはtry / freeを除いてですが、フレームスタックの下位には(少なくとも)そのようなブロックが1つあります。これは、他の機能(を含む os.path.isfile)にも当てはまります。

    1.1。[Python 3]:パス。is_file()

    • これは、パスを処理するためのより洗練された(そしてより多くの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。抑制*例外) -例外を選択的に抑制するために特別に設計されました


    しかし、彼らはオーバーラッパーのように見えるのtry /除く//ようやくとして、ブロック[Pythonの3]:付きの文の状態:

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

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

    • [Python 3]:os。listdirpath = '。')(または[Python 3]:os .scandirpath = '。') on Python v 3.5 +、backport:[PyPI]:scandir)

      • 内部では、両方とも以下を使用します。

        • Nix:[man7]:OPENDIR(3) / [man7]:READDIR(3) / [man7]:CLOSEDIR(3)
        • Win:[MS.Docs]:FindFirstFileW関数/ [MS.Docs]:FindNextFileW関数/ [MS.Docs]:FindClose関数

        [GitHub]経由:python / cpython-(マスター)cpython / Modules / posixmodule.c

      listdir()の代わりにscandir()を使用すると、ファイルタイプまたはファイル属性情報も必要とするコードのパフォーマンスを大幅に向上させることができます。これは、オペレーティングシステムがディレクトリのスキャン時にこの情報を提供する場合、os.DirEntryオブジェクトがこの情報を公開するためです。すべてのos.DirEntryメソッドはシステムコールを実行できますが、is_dir()およびis_file()は通常、シンボリックリンクのシステムコールのみを必要とします。os.DirEntry.stat()は、Unixでは常にシステムコールを必要としますが、Windowsではシンボリックリンクに1つだけ必要です。

    • [Python 3]:os。walktop、topdown = True、onerror = None、followlinks = False
      • 使用しますos.listdiros.scandir利用可能な場合)
    • [Python 3]:グロブ。iglob、*、再帰的な= Falseのパス名)(またはその前身:glob.glob
      • それ自体はトラバース機能ではないようですが(少なくとも場合によっては)、それでも使用しますos.listdir


    これらはフォルダを反復処理するため(ほとんどの場合)、問題に対して非効率的です(@ShadowRangerが指摘したように、ワイルドカード以外のglob bingなどの例外があります)。したがって、これらを主張するつもりはありません。言うまでもなく、ファイル名の処理が必要になる場合もあります。

  4. [Python 3]:os。accesspath、mode、*、dir_fd = None、effective_ids = False、follow_symlinks = True)の動作が近いos.path.exists(実際には、主に2番目の引数のために幅が広い)

    • ドキュメントに記載されているように、ユーザー権限によってファイルの「可視性」が制限される場合があります。

      ...呼び出し元のユーザーがパスへの指定されたアクセス権を持っているかどうかをテストします。パスの存在をテストするには、モードをF_OKにする必要があります。

    os.access("/tmp", os.F_OK)

    私はまた、作業のでCボンネットの下に、それが呼び出すので、私もこの方法を使用して、ネイティブAPI S(経由再び、「$ {PYTHON_SRC_DIR} /Modules/posixmodule.cを」)、それはまた、可能するためのゲートを開き、ユーザエラー、それはようではありませんPythonの他の変異体としてのIC。したがって、@ AaronHallが正しく指摘しているように、何をしているのかを理解していない限り、使用しないでください。

    • Nix:[man7]:ACCESS(2)(!!!その使用法がもたらす可能性のあるセキュリティホールについての注意に注意してください!!!)
    • Win:[MS.Docs]:GetFileAttributesW関数

    :ネイティブAPIの呼び出しは、[Python 3]を介して行うこともできます。ctypes -Python用の外部関数ライブラリですが、ほとんどの場合、より複雑です。

    Win固有):vcruntime *msvcr *)。dllは[MS.Docs]をエクスポートするため:_access、_waccess関数ファミリーも同様です。例を次に示します。

    Python 3.5.3 (v3.5.3:1880cb95a742, Jan 16 2017, 16:02:32) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os, ctypes
    >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe", os.F_OK)
    0
    >>> ctypes.CDLL("msvcrt")._waccess(u"C:\\Windows\\System32\\cmd.exe.notexist", os.F_OK)
    -1
    

    • それは良い習慣ではありませんが、私はos.F_OK呼び出しで使用していますが、それは明確にするためです(その値は0です
    • 私は_waccessを使用しているので、同じコードがPython3Python2機能ます(それらの間のUnicode関連の違いにもかかわらず)
    • これは非常に特定の領域を対象としていますが、これまでの回答では言及されていませんでした


    LNXUbtu(16 x64)の同様に)相手:

    Python 3.5.2 (default, Nov 17 2016, 17:05:23)
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os, ctypes
    >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp", os.F_OK)
    0
    >>> ctypes.CDLL("/lib/x86_64-linux-gnu/libc.so.6").access(b"/tmp.notexist", os.F_OK)
    -1
    

    • 代わりにハードコーディングするのlibcのパス(『/lib/x86_64-linux-gnu/libc.so.6』(最も可能性が高い、となります)は、システム、全体で変更される場合があります)なし(または空の文字列が)に渡すことができるCDLLのコンストラクタ(ctypes.CDLL(None).access(b"/tmp", os.F_OK))。[man7]によると:DLOPEN(3):

      filenameがNULLの場合、返されるハンドルはメインプログラム用です。このハンドルをdlsym()に指定すると、メインプログラムでシンボルが検索され、プログラムの起動時にすべての共有オブジェクトが読み込まれ、次にdlopen()によってフラグRTLD_GLOBALで読み込まれるすべての共有オブジェクトが検索されます。

      • メイン(現在の)プログラム(python)はlibcに対してリンクされているため、そのシンボル(アクセスを含む)がロードされます
      • mainPy_Main、および(すべての)その他の関数が使用可能であるため、これは注意して処理する必要があります。それらを呼び出すと、(現在のプログラムに)壊滅的な影響を与える可能性があります
      • これはWinにも当てはまりません(ただし、msvcrt.dllはデフォルトで%PATH%にある"%SystemRoot%\ System32"にあるため、それほど大きな問題ではありません)。さらに進んで、Winでこの動作を複製(およびパッチを送信)したかったのですが、結局のところ、[MS.Docs]:GetProcAddress関数はエクスポートされたシンボルのみを「見る」ので、誰かがメインの実行可能ファイルで関数を宣言しない限り(地球上の理由正規の人はそれを行うのでしょうか?)は、メインプログラムは、ロード可能なもののほとんど使用できません__declspec(dllexport)
  5. ファイルシステム機能を備えたサードパーティモジュールをインストールする

    ほとんどの場合、上記の方法の1つに依存します(おそらくわずかなカスタマイズが必要です)。
    1つの例は(ここでもWin固有)[GitHub]です。mhammond/ pywin32-Python for Windows(pywin32)Extensions、これはWINAPIPythonラッパーです。

    ただし、これは回避策のようなものなので、ここで停止します。

  6. もう1つの(不完全な)回避策(gainarie)は、(私がそれを呼ぶのが好きなように)sysadminアプローチです:シェルコマンドを実行するためのラッパーとしてPythonを使用します

    • 勝つ

      (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe\" > nul 2>&1'))"
      0
      
      (py35x64_test) e:\Work\Dev\StackOverflow\q000082831>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os; print(os.system('dir /b \"C:\\Windows\\System32\\cmd.exe.notexist\" > nul 2>&1'))"
      1
      
    • NixLnxUbtu)):

      [[email protected]:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))"
      0
      [[email protected]:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))"
      512
      

結論

  • やるの使用を試して/除く外//最後に、彼らはあなたが厄介な一連の問題に実行して防ぐことができるので、ブロックを。私が考えることができる反例はパフォーマンスです。このようなブロックはコストがかかるため、1秒間に数十万回実行されるはずのコードに配置しないようにしてください(ただし、(ほとんどの場合)ディスクアクセスが含まれるため、そうではありません)。

最後の注意

  • 私はそれを最新の状態に保つように努めます、どんな提案も歓迎します、私は答えに出てくるであろう有用なものを何でも取り入れます
178
Cody Piersall 2014-02-08 16:38.

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
158
un33k 2013-06-28 03:38.

これは、ファイルが存在するかどうかを確認する最も簡単な方法です。ちょうどので、あなたがチェックすると、ファイルが存在しない保証あなたがそれを開くために必要がある場合、それはあるだろうということ。

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")
129
pkoch 2009-11-04 14:48.

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

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

  • スタイル:のセクション「異常な状態の処理」 http://allendowney.com/sd/notes/notes11.txt
  • 競合状態の回避
125
Aaron Hall 2015-08-11 17:54.

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

Python 3.4以降で利用できるようになりPath、ファイル名でオブジェクトをインポートしてインスタンス化し、is_fileメソッドを確認します(これにより、通常のファイルを指すシンボリックリンクに対してもTrueが返されることに注意してください)。

>>> from pathlib import Path
>>> Path('/').is_file()
False
>>> Path('/initrd.img').is_file()
True
>>> Path('/doesnotexist').is_file()
False

あなたは、Python 2を使っているのであれば、あなたは、は、PyPIからpathlibモジュールをバックポートすることができpathlib2、またはそれ以外のチェックisfileからos.pathモジュール:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False

さて、上記はおそらくここでの最良の実用的な直接の答えですが、競合状態の可能性があり(達成しようとしていることに依存します)、基礎となる実装はを使用しますがtry、Pythonはtryその実装のどこでも使用します。

Pythonはtryどこでも使用するため、Pythonを使用する実装を回避する理由は実際にはありません。

しかし、この回答の残りの部分では、これらの警告を検討しようとしています。

より長く、はるかに衒学的な答え

Python 3.4以降で使用可能で、の新しいPathオブジェクトを使用しますpathlib.existsディレクトリはファイルではないため、これは正しくないことに注意してください(すべてがファイルであるというUNIXの意味を除く)。

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True

したがって、使用する必要がありますis_file

>>> root.is_file()
False

ここにヘルプがありis_fileます:

is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).

それでは、ファイルであることがわかっているファイルを取得しましょう。

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True

デフォルトでは、NamedTemporaryFile閉じたときにファイルを削除します(ファイルへの参照がなくなると自動的に閉じます)。

>>> del file
>>> filepathobj.exists()
False
>>> filepathobj.is_file()
False

ただし、実装を掘り下げると、次のものがis_file使用されていることがわかりますtry

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

競合状態:試してみるのが好きな理由

try競合状態を回避できるので気に入っています。を使用tryすると、ファイルが存在することを期待してファイルを読み取ろうとします。そうでない場合は、例外をキャッチして、意味のあるフォールバック動作を実行します。

ファイルを読み取ろうとする前にファイルが存在することを確認したい場合、ファイルを削除してから複数のスレッドまたはプロセスを使用している可能性があります。または、別のプログラムがそのファイルを認識して削除する可能性があります。状態(存在)が変化する前にそれを開くために競争しているので、それが存在することを確認した場合の競合状態

競合状態は、プログラムが失敗する原因となる可能性のあるウィンドウが非常に小さいため、デバッグが非常に困難です。

ただし、これが動機である場合trysuppressコンテキストマネージャーを使用してステートメントの値を取得できます。

tryステートメントなしで競合状態を回避する: suppress

Python 3.4は、suppressコンテキストマネージャー(以前はignoreコンテキストマネージャー)を提供します。これは、意味的にまったく同じことをより少ない行で実行すると同時に、(少なくとも表面的には)元の要求に応えてtryステートメントを回避します。

from contextlib import suppress
from pathlib import Path

使用法:

>>> with suppress(OSError), Path('doesnotexist').open() as f:
...     for line in f:
...         print(line)
... 
>>>
>>> with suppress(OSError):
...     Path('doesnotexist').unlink()
... 
>>> 

以前のPythonの場合、独自のをロールすることができましたがsuppress、がないtry場合は、ある場合よりも冗長になります。代わりにコンテキストマネージャーを使用するため、Python3.4より前に適用できるPythonのどのレベルでも使用さtryれない唯一の答えは実際にはこれだと思います。

class suppress(object):
    def __init__(self, *exceptions):
        self.exceptions = exceptions
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_value, traceback):
        if exc_type is not None:
            return issubclass(exc_type, self.exceptions)

試してみるとおそらく簡単です:

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass

「試さずに」という要求に合わないその他のオプション:

isfile

import os
os.path.isfile(path)

ドキュメントから:

os.path.isfile(path)

パスが既存の通常ファイルの場合はTrueを返します。これは、シンボリックリンクをたどり、その両方islink()isfile()同じパスのために真であることができます。

ただし、この関数のソースを調べると、実際にはtryステートメントが使用されていることがわかります。

# This follows symbolic links, so both islink() and isdir() can be true
# for the same path on systems that support symlinks
def isfile(path):
    """Test whether a path is a regular file"""
    try:
        st = os.stat(path)
    except os.error:
        return False
    return stat.S_ISREG(st.st_mode)
>>> OSError is os.error
True

指定されたパスを使用して統計を取得できるOSErrorかどうかを確認し、例外が発生しなかった場合はファイルであるかどうかをキャッチして確認するだけです。

ファイルを使って何かをするつもりなら、競合状態を避けることを除いて、tryで直接試すことをお勧めします。

try:
    with open(path) as f:
        f.read()
except OSError:
    pass

os.access

UnixとWindowsでos.access使用できますが、使用するにはフラグを渡す必要があり、ファイルとディレクトリを区別しません。これは、実際の呼び出し側ユーザーが昇格された特権環境でアクセスできるかどうかをテストするためによく使用されます。

import os
os.access(path, os.F_OK)

また、と同じ競合状態の問題が発生しisfileます。ドキュメントから:

注:access()を使用して、ユーザーがファイルを開く権限があるかどうかを確認してから、実際にopen()を使用すると、セキュリティホールが作成されます。これは、ユーザーがファイルを確認してから開くまでの短い時間間隔を利用してファイルを操作する可能性があるためです。EAFP手法を​​使用することをお勧めします。例えば:

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()
return "some default data"

次のように書く方が良いです:

try:
    fp = open("myfile")
except IOError as e:
    if e.errno == errno.EACCES:
        return "some default data"
    # Not a permission error.
    raise
else:
    with fp:
        return fp.read()

の使用は避けてくださいos.access。これは、上記で説明した高レベルのオブジェクトや関数よりもユーザーエラーの可能性が高い低レベルの関数です。

別の答えに対する批判:

別の答えはこれについて言いますos.access

個人的には、これが好きです。内部では、ネイティブAPIを呼び出します( "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c"を介して)が、ユーザーエラーの可能性のゲートも開き、他のバリアントほどPythonicではありません。 :

この回答は、正当化のない、非Pythonicでエラーが発生しやすい方法を好むことを示しています。ユーザーが理解せずに低レベルのAPIを使用することを奨励しているようです。

また、無条件にを返すTrueことにより、すべての例外(KeyboardInterruptおよびSystemExit!を含む)をサイレントに渡すことができるコンテキストマネージャーを作成します。これは、バグを隠すための優れた方法です。

これは、ユーザーが不適切な慣行を採用することを奨励しているようです。

89
karlgzafiris 2015-05-26 08:29.
import os
#Your path here e.g. "C:\Program Files\text.txt"
#For access purposes: "C:\\Program Files\\text.txt"
if os.path.exists("C:\..."):   
    print "File found!"
else:
    print "File not found!"

インポートosすると、オペレーティングシステムでのナビゲートと標準アクションの実行が簡単になります。

参考までに、Pythonを使用してファイルが存在するかどうかを確認する方法も参照してください。

高レベルの操作が必要な場合は、を使用してくださいshutil

88
Tom Fuller 2016-10-09 02:43.

os.path.isfile()os.path.isdir()およびを使用したファイルとフォルダーのテストos.path.exists()

「パス」が有効なパスであると仮定すると、この表は、ファイルとフォルダーの各関数によって返されるものを示しています。

ファイルがos.path.splitext()拡張子を取得するために使用する特定の種類のファイルであるかどうかをテストすることもできます(まだ知らない場合)

>>> import os
>>> path = "path to a word document"
>>> os.path.isfile(path)
True
>>> os.path.splitext(path)[1] == ".docx" # test if the extension is .docx
True
75
KaiBuxe 2016-02-25 02:44.

2016年でも、最善の方法はまだ使用していos.path.isfileます:

>>> os.path.isfile('/path/to/some/file.txt')

またはPython3では次を使用できますpathlib

import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
    ...
68
chad 2013-09-25 15:52.

try / exceptionとisfile()、の間に意味のある機能の違いがあるようには見えないので、どちらが意味があるかを使用する必要があります。

ファイルを読み取りたい場合、ファイルが存在する場合は、

try:
    f = open(filepath)
except IOError:
    print 'Oh dear.'

ただし、ファイルが存在する場合は名前を変更したいだけで、ファイルを開く必要がない場合は、次のようにします。

if os.path.isfile(filepath):
    os.rename(filepath, filepath + '.old')

ファイルに書き込みたい場合、ファイルが存在しない場合は、

# python 2
if not os.path.isfile(filepath):
    f = open(filepath, 'w')

# python 3, x opens for exclusive creation, failing if the file already exists
try:
    f = open(filepath, 'wx')
except IOError:
    print 'file already exists'

ファイルロックが必要な場合、それは別の問題です。

61
philberndt 2011-01-26 13:00.

あなたはこれを試すことができます(より安全です):

try:
    # http://effbot.org/zone/python-with-statement.htm
    # 'with' is safer to open a file
    with open('whatever.txt') as fh:
        # Do something with 'fh'
except IOError as e:
    print("({})".format(e))

出力は次のようになります。

([Errno 2]そのようなファイルまたはディレクトリはありません: 'whatever.txt')

次に、結果に応じて、プログラムをそこから実行し続けることも、必要に応じてプログラムを停止するようにコーディングすることもできます。

53
Calculus 2017-12-04 22:51.

日付:2017-12-04

考えられるすべての解決策は、他の回答に記載されています。

ファイルが存在するかどうかを確認するための直感的で議論の余地のある方法は次のとおりです。

import os
os.path.isfile('~/file.md')  # Returns True if exists, else False
# additionaly check a dir
os.path.isdir('~/folder')  # Returns True if the folder exists, else False
# check either a dir or a file
os.path.exists('~/file')

参考までに、徹底的なチートシートを作成しました。

#os.path methods in exhaustive cheatsheet
{'definition': ['dirname',
               'basename',
               'abspath',
               'relpath',
               'commonpath',
               'normpath',
               'realpath'],
'operation': ['split', 'splitdrive', 'splitext',
               'join', 'normcase'],
'compare': ['samefile', 'sameopenfile', 'samestat'],
'condition': ['isdir',
              'isfile',
              'exists',
              'lexists'
              'islink',
              'isabs',
              'ismount',],
 'expand': ['expanduser',
            'expandvars'],
 'stat': ['getatime', 'getctime', 'getmtime',
          'getsize']}
52
Zizouz212 2014-12-27 10:05.

私は常にtryandexceptステートメントを使用することをお勧めしますが、ここにいくつかの可能性があります(私の個人的なお気に入りはを使用していますos.access):

  1. ファイルを開いてみてください:

    ファイルを開くと、常にファイルの存在が確認されます。次のような関数を作成できます。

    def File_Existence(filepath):
        f = open(filepath)
        return True
    

    Falseの場合、Pythonの以降のバージョンでは、処理されていないIOErrorまたはOSErrorで実行が停止します。例外をキャッチするには、tryexcept句を使用する必要があります。もちろん、いつでもtryそのようなexcept`ステートメントを使用できます(私に考えさせてくれたhsandtに感謝します):

    def File_Existence(filepath):
        try:
            f = open(filepath)
        except IOError, OSError: # Note OSError is for later versions of Python
            return False
    
        return True
    
  2. 使用os.path.exists(path)

    これにより、指定したものの存在が確認されます。ただし、ファイルディレクトリをチェックするため、使用方法に注意してください。

    import os.path
    >>> os.path.exists("this/is/a/directory")
    True
    >>> os.path.exists("this/is/a/file.txt")
    True
    >>> os.path.exists("not/a/directory")
    False
    
  3. 使用os.access(path, mode)

    これにより、ファイルにアクセスできるかどうかが確認されます。権限をチェックします。os.pyのドキュメントに基づいて、を入力os.F_OKすると、パスの存在が確認されます。ただし、これを使用すると、アクセス許可を確認してからファイルを開くまでの時間を使用して誰かがファイルを攻撃する可能性があるため、セキュリティホールが作成されます。代わりに、ファイルのアクセス許可を確認するのではなく、ファイルを直接開く必要があります。(EAFPとLBYP)。後でファイルを開かず、その存在を確認するだけの場合は、これを使用できます。

    とにかく、ここで:

    >>> import os
    >>> os.access("/is/a/file.txt", os.F_OK)
    True
    

また、ファイルの存在を確認できない方法が2つあることにも言及する必要があります。問題はpermission deniedまたはになりno such file or directoryます。を見つけたらIOErrorIOError as e(私の最初のオプションのように)をprint(e.args)設定してから、問題を特定できるように入力します。お役に立てば幸いです。:)

38
bergercookie 2014-10-13 21:45.

ファイルを開くためのものである場合は、次のいずれかの手法を使用できます。

with open('somefile', 'xt') as f: #Using the x-flag, Python3.3 and above
    f.write('Hello\n')

if not os.path.exists('somefile'): 
    with open('somefile', 'wt') as f:
        f.write("Hello\n")
else:
    print('File already exists!')

更新

混乱を避けるために、私が得た回答に基づいて、現在の回答では、指定された名前のファイルまたはディレクトリが検索されます。

37
zgoda 2008-09-18 03:13.

さらにos.access()

if os.access("myfile", os.R_OK):
    with open("myfile") as fp:
        return fp.read()

ビーイングR_OKW_OKおよびX_OK権限のためのテスト(へのフラグDOC)。

20
Pedro Lobito 2015-04-28 16:45.
if os.path.isfile(path_to_file):
    try: 
        open(path_to_file)
            pass
    except IOError as e:
        print "Unable to open file"

例外を発生させることは、プログラム内のフロー制御のための許容可能なPythonicのアプローチであると見なされます。不足しているファイルをIOErrorsで処理することを検討してください。この状況では、ファイルは存在するがユーザーに読み取り権限がない場合、IOError例外が発生します。

SRC: http://www.pfinn.net/python-check-if-file-exists.html

20
durjoy 2017-08-10 19:50.

あなたが他の目的のために既にnumpyのをインポートした場合、その後のような他のライブラリをインポートする必要はありませんpathlibospathsなどは、

import numpy as np
np.DataSource().exists("path/to/your/file")

これは、その存在に基づいてtrueまたはfalseを返します。

18
Chris 2014-02-11 11:30.

ブライアンの提案は、なしで書くことができますtry:

from contextlib import suppress

with suppress(IOError), open('filename'):
    process()

suppressPython3.4の一部です。古いリリースでは、独自の抑制をすばやく作成できます。

from contextlib import contextmanager

@contextmanager
def suppress(*exceptions):
    try:
        yield
    except exceptions:
        pass
17
Ali Hallaji 2018-03-04 20:24.

ファイルまたはディレクトリが存在することを確認してください

次の3つの方法に従うことができます。

注1:os.path.isfileファイルにのみ使用されます

import os.path
os.path.isfile(filename) # True if file exists
os.path.isfile(dirname) # False if directory exists

注2:os.path.existsファイルとディレクトリの両方に使用されます

import os.path
os.path.exists(filename) # True if file exists
os.path.exists(dirname) #True if directory exists

pathlib.Path方法(Pythonで含ま3+、Pythonの2ピップとインストール)

from pathlib import Path
Path(filename).exists()
16
Marcel Wilson 2016-08-06 05:54.

他の回答に正確に反映されていないもう1つのわずかなバリエーションを追加します。

これは、file_path存在Noneまたは空の文字列の場合を処理します。

def file_exists(file_path):
    if not file_path:
        return False
    elif not os.path.isfile(file_path):
        return False
    else:
        return True

Shahbazからの提案に基づいてバリアントを追加する

def file_exists(file_path):
    if not file_path:
        return False
    else:
        return os.path.isfile(file_path)

PeterWoodからの提案に基づいてバリアントを追加する

def file_exists(file_path):
    return file_path and os.path.isfile(file_path):
16
Mike McKerns 2016-05-06 02:00.

私は約10年前から出回っているパッケージの作者であり、この質問に直接答える機能を持っています。基本的に、Windows以外のシステムを使用Popenしている場合は、を使用してにアクセスしますfind。ただし、Windowsを使用している場合はfind、効率的なファイルシステムウォーカーで複製されます。

コード自体はtryブロックを使用しません…オペレーティングシステムを決定し、「Unix」スタイルfindまたはハンドビルトに誘導する場合を除きfindます。タイミングテストではtry、OSの決定が速いことが示されたので、そこで使用しました(ただし、他の場所では使用しませんでした)。

>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']

そしてドキュメント…

>>> print pox.find.__doc__
find(patterns[,root,recurse,type]); Get path to a file or directory

    patterns: name or partial name string of items to search for
    root: path string of top-level directory to search
    recurse: if True, recurse down from root directory
    type: item filter; one of {None, file, dir, link, socket, block, char}
    verbose: if True, be a little verbose about the search

    On some OS, recursion can be specified by recursion depth (an integer).
    patterns can be specified with basic pattern matching. Additionally,
    multiple patterns can be specified by splitting patterns with a ';'
    For example:
        >>> find('pox*', root='..')
        ['/Users/foo/pox/pox', '/Users/foo/pox/scripts/pox_launcher.py']

        >>> find('*shutils*;*init*')
        ['/Users/foo/pox/pox/shutils.py', '/Users/foo/pox/pox/__init__.py']

>>>

あなたが見たいのであれば、実装はここにあります: https://github.com/uqfoundation/pox/blob/89f90fb308f285ca7a62eabe2c38acb87e89dad9/pox/shutils.py#L190

15

Linuxコマンドライン環境用の1行のPythonコマンドを次に示します。私はそれほどホットなBashの男ではないので、これは非常に便利だと思います。

python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"

これがお役に立てば幸いです。

12
Pradip Das 2014-12-21 05:21.

Pythonの「OS」ライブラリを使用できます。

>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False
12
Inconnu 2016-12-02 20:39.

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

2016年でも、これは間違いなく、ファイルが存在するかどうか、およびファイルであるかどうかを確認する最も簡単な方法です。

import os
os.path.isfile('./file.txt')    # Returns True if exists, else False

isfile実際には、内部で使用するヘルパーメソッドos.statstat.S_ISREG(mode)その下にあります。これos.statは、ファイル、ディレクトリ、ソケット、バッファなどに関する詳細情報を提供する低レベルのメソッドです。os.statの詳細はこちら

注:ただし、このアプローチではファイルがロックされないため、コードが「チェック時から使用時」(TOCTTOU)のバグに対して脆弱になる可能性があります。

したがって、例外を発生させることは、プログラムのフロー制御のための許容可能なPythonicのアプローチであると見なされます。そして、ifステートメントではなく、IOErrorsを使用して欠落しているファイルを処理することを検討する必要があります(単なるアドバイス)。

9
Khaled.K 2015-08-05 20:28.
import os.path

def isReadableFile(file_path, file_name):
    full_path = file_path + "/" + file_name
    try:
        if not os.path.exists(file_path):
            print "File path is invalid."
            return False
        elif not os.path.isfile(full_path):
            print "File does not exist."
            return False
        elif not os.access(full_path, os.R_OK):
            print "File cannot be read."
            return False
        else:
            print "File can be read."
            return True
    except IOError as ex:
        print "I/O error({0}): {1}".format(ex.errno, ex.strerror)
    except Error as ex:
        print "Error({0}): {1}".format(ex.errno, ex.strerror)
    return False
#------------------------------------------------------

path = "/usr/khaled/documents/puzzles"
fileName = "puzzle_1.txt"

isReadableFile(path, fileName)

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

今週のコミックコンですべての素晴らしいものに追いつく方法

今週のコミックコンですべての素晴らしいものに追いつく方法

サンディエゴコミックコンは今週開幕し、オタクのアナウンス、ポスター、予告編、お気に入りの番組や映画のからかいでいっぱいになります。SDCCは、コンベンションフロア全体の多くのパネルで行われているため、すべてに対応するのは難しい場合があります。

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

小さなアプリ開発者は金曜日に発表された法的な和解でグーグルから9千万ドルをこじ開けた。アップルとの同様の合意に続いて熱くなった。金曜日のブログ投稿で、Googleは、Androidメーカーが市場での優位性を悪用してPlayストア経由でのアプリ内購入に対して30%の料金を不当に請求したと主張するアプリ開発者との訴訟を解決するために、9千万ドルを支払うことに合意したと述べました。

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

今週、RadioShackのTwitterアカウントは、奇妙なものから完全にひどいものになりました。短い順序で、会社のフィード全体が、バイブレーター、「ビッグティット」(スペルミス)、有名人やその他の企業アカウントを荒らしているツイートなど、NSFW素材の真の山になりました。

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

大型ハドロン衝突型加速器のトンネル内にあるコンパクトミュオンソレノイド(CMS)検出器。2012年7月4日、CERNの科学者たちは、1960年代に最初に提案された素粒子であるヒッグス粒子の観測を確認しました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Un breve viaje espacial sobre conceptualizar el diseño

Complicarse la vida, mezclar churros con meninas (nada de ovejas) y encontrar valor en un trastero que adquiriste en una puja.

Un breve viaje espacial sobre conceptualizar el diseño

Bien. Hay un momento en toda salida al espacio exterior en el que de la tensión, la velocidad y las altas temperaturas derivadas del cruce de estratosfera a ionosfera se pasa a un momento de súbita calma, donde se despliega la vista completa del paisaje espacial que nos rodea.

Seguindo Todos os Protocolos (2022), de Fábio Leal

Seguindo Todos os Protocolos (2022), de Fábio Leal

Chico quer transar. Até aí, tudo bem.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language