try
ステートメントを使用せずに、ファイルが存在するかどうかを確認するにはどうすればよいですか?
42 に答える
チェックしている理由が のようなことができるようにするためである場合は、それを開こうとする前にif file_exists: open_it()
a を使用する方が安全です。try
チェックしてから開くと、ファイルが削除または移動されるか、チェックしてから開こうとするまでの間の何かのリスクがあります。
ファイルをすぐに開く予定がない場合は、次を使用できますos.path.isfile
True
path が既存の通常ファイルである場合に戻ります。これはシンボリック リンクに従うため、同じパスに対してislink ()とisfile( ) の両方が true になる可能性があります。
import os.path
os.path.isfile(fname)
ファイルであることを確認する必要がある場合。
Python 3.4 以降、pathlib
モジュールはオブジェクト指向のアプローチを提供します ( pathlib2
Python 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
あなたはos.path.exists
機能を持っています:
import os.path
os.path.exists(file_path)
これはファイルとディレクトリの両方を返しますTrue
が、代わりに使用できます
os.path.isfile(file_path)
具体的にファイルであるかどうかをテストします。シンボリックリンクに従います。
とは異なり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
import os
if os.path.isfile(filepath):
print("File exists")
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")
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
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
これは、ファイルが存在するかどうかを確認する最も簡単な方法です。チェックしたときにファイルが存在していたからといって、それを開く必要があるときにそこにあるとは限りません。
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")
Python を使用して、try ステートメントを使用せずにファイルが存在するかどうかを確認するにはどうすればよいですか?
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 を使用している場合は、pathlib モジュールを pypi からバックポートするか、モジュールからチェック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
Race Conditions: トライが好きな理由
try
競合状態を回避できるので気に入っています。を使用try
すると、ファイルがそこにあることを期待して単純にファイルを読み取ろうとし、そうでない場合は例外をキャッチして、意味のあるフォールバック動作を実行します。
ファイルを読み取ろうとする前にそのファイルが存在することを確認したい場合で、そのファイルを削除しようとしていて、複数のスレッドまたはプロセスを使用している可能性がある場合、または別のプログラムがそのファイルを認識していて削除できる可能性がある場合は、次の可能性があります。存在することを確認すると競合状態になります。これは、その状態(存在) が変化する前に競合状態で開くためです。
競合状態はデバッグが非常に困難です。これは、プログラムが失敗する原因となるウィンドウが非常に小さいためです。
しかし、これが動機である場合は、コンテキスト マネージャーを使用してステートメントの値を取得できます。try
suppress
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
使用するよりも冗長になります。これは、代わりにコンテキストマネージャーを使用するため、Python 3.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)
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-except を使用して直接試すことをお勧めします。
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() を使用して、ユーザーがファイルを実際に開く前に、たとえばファイルを開く権限があるかどうかを確認すると、セキュリティ ホールが作成されます。これは、ユーザーがファイルを確認してから開くまでの短い時間間隔を悪用して、ファイルを操作する可能性があるためです。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
。これは、バグを隠す良い方法です。
これは、ユーザーが不適切な慣行を採用することを助長しているようです。
tryステートメントを優先します。より良いスタイルと見なされ、競合状態を回避します。
私の言葉を信じないでください。この理論には多くの支持があります。ここにいくつかあります:
- スタイル: http://allendowney.com/sd/notes/notes11.txtのセクション「異常な状態の処理」
- 競合状態の回避
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
。
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
2016年、最良の方法はまだ使用していos.path.isfile
ます:
>>> os.path.isfile('/path/to/some/file.txt')
または Python 3 では、次を使用できますpathlib
。
import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
...
try/except と の間に意味のある機能上の違いがあるようには見えないので、意味のある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'
ファイルのロックが必要な場合は、別の問題です。
TL;DR
の
答えは次のとおりです:pathlib
モジュール -- 1 行のコードで --
Pathlibは、ほぼすべてのファイル操作でおそらく最も最新で便利な方法です。ファイルまたはフォルダーの存在については、1 行のコードで十分です。
from pathlib import Path
if Path("myfile.txt").exists(): # works for both file and folders
# do your cool stuff...
このpathlib
モジュールは で導入されたPython 3.4
ため、Python 3.4+ が必要です。この lib を使用すると、ファイルやフォルダーを操作する際の作業がはるかに簡単になり、使いやすくなります。これに関する詳細なドキュメントは次のとおりです ( https://docs.python. org/3/library/pathlib.html )。
ところで、パスを再利用する場合は、変数に割り当てることをお勧めします
そうなる
from pathlib import Path
p = Path("loc/of/myfile.txt")
if p.exists(): # works for both file and folders
# do stuffs...
#reuse 'p' if needed.
これを試すことができます(より安全です):
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')
次に、結果に応じて、プログラムはそこから実行を続けるか、必要に応じて停止するようにコーディングできます。
私は常にtry
andexcept
ステートメントを使用することをお勧めしますが、いくつかの可能性があります (私の個人的なお気に入りは の使用ですos.access
)。
ファイルを開いてみてください:
ファイルを開くと、常にファイルの存在が確認されます。次のように関数を作成できます。
def File_Existence(filepath): f = open(filepath) return True
False の場合、Python の以降のバージョンでは未処理の IOError または OSError で実行が停止します。例外をキャッチするには、try except 句を使用する必要があります。もちろん、次のようにいつでも
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
使用
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
使用
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
。をキャッチした場合はIOError
、IOError as e
(私の最初のオプションのように) を設定しprint(e.args)
、問題を特定できるように入力します。それが役立つことを願っています!:)
さらに、os.access()
:
if os.access("myfile", os.R_OK):
with open("myfile") as fp:
return fp.read()
、、R_OK
および権限をテストするフラグ ( W_OK
doc )。X_OK
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 例外が発生します。
NumPy を他の目的で既にインポートしている場合はpathlib
、os
、paths
、 などの他のライブラリをインポートする必要はありません。
import numpy as np
np.DataSource().exists("path/to/your/file")
これは、その存在に基づいて true または false を返します。
.なしでブライアンの提案を書くことができますtry:
。
from contextlib import suppress
with suppress(IOError), open('filename'):
process()
suppress
Python 3.4 の一部です。古いリリースでは、独自の抑制をすばやく記述できます。
from contextlib import contextmanager
@contextmanager
def suppress(*exceptions):
try:
yield
except exceptions:
pass
私は約 10 年前から存在するパッケージの作成者であり、この質問に直接対処する機能を備えています。基本的に、Windows 以外のシステムを使用している場合は、 を使用Popen
してアクセスしますfind
。ただし、Windows を使用している場合はfind
、効率的なファイルシステム ウォーカーを使用してレプリケートします。
コード自体はブロックを使用しませんtry
…オペレーティングシステムを決定し、「Unix」スタイルfind
または手作りのfind
. タイミング テストではtry
、OS の判別が高速であることが示されたので、そこでは 1 つを使用しました (ただし、他の場所では使用しませんでした)。
>>> import pox
>>> pox.find('*python*', type='file', root=pox.homedir(), recurse=False)
['/Users/mmckerns/.python']
そしてドキュメント…</p>
>>> 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']
>>>
見たい場合の実装は次のとおりです 。
他の回答には正確に反映されていないわずかなバリエーションをもう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)
Peter Wood からの提案に基づくバリアントの追加
def file_exists(file_path):
return file_path and os.path.isfile(file_path):
Linux コマンド ライン環境用の 1 行の Python コマンドを次に示します。私はそれほど熱心な Bash の男ではないので、これは非常に便利だと思います。
python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"
これがお役に立てば幸いです。
Python の「OS」ライブラリを使用できます。
>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt")
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False
try ステートメントを使用せずに、ファイルが存在するかどうかを確認するにはどうすればよいですか?
2016 年になっても、これは間違いなく、ファイルが存在するかどうか、およびそれがファイルであるかどうかの両方を確認する最も簡単な方法です。
import os
os.path.isfile('./file.txt') # Returns True if exists, else False
isfile
os.stat
実際には、内部で andを使用する単なるヘルパー メソッドですstat.S_ISREG(mode)
。これos.stat
は、ファイル、ディレクトリ、ソケット、バッファなどに関する詳細情報を提供する低レベルのメソッドです。os.stat の詳細はこちら
注:ただし、この方法ではファイルがロックされないため、コードが「チェック時から使用時まで」( TOCTTOU ) バグに対して脆弱になる可能性があります。
そのため、例外を発生させることは、プログラム内のフロー制御のための受け入れ可能な Pythonic アプローチであると見なされます。また、不足しているファイルをステートメントではなく IOErrors で処理することを検討する必要がありますif
(単なるアドバイス)。
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)
絶対にこれを使うべきです。
from os.path import exists
if exists("file") == True:
print "File exists."
elif exists("file") == False:
print "File doesn't exist."
import os
path = /path/to/dir
root,dirs,files = os.walk(path).next()
if myfile in files:
print "yes it exists"
これは、複数のファイルをチェックする場合に役立ちます。または、既存のリストとの交差/減算を行いたい場合。
To check if a file exists,
from sys import argv
from os.path import exists
script, filename = argv
target = open(filename)
print "file exists: %r" % exists(filename)
os.listdir を使用して、ファイルが特定のディレクトリにあるかどうかを確認できます。
import os
if 'file.ext' in os.listdir('dirpath'):
#code
import os
# for testing purpose args defaulted to current folder & file.
# returns True if file found
def file_exists(FOLDER_PATH='../', FILE_NAME=__file__):
return os.path.isdir(FOLDER_PATH) \
and os.path.isfile(os.path.join(FOLDER_PATH, FILE_NAME))
基本的にはフォルダ チェック、次にos.path.joinを使用した適切なディレクトリ セパレータを使用したファイル チェックです。