回答:
チェックしている理由がのようなことができるようif file_exists: open_it()
にする場合は、try
around を使用して開こうとするほうが安全です。チェックしてから開くと、ファイルを削除または移動したり、チェックしてから開こうとしたりする間にリスクが生じます。
ファイルをすぐに開く予定がない場合は、 os.path.isfile
True
パスが既存の通常のファイルである場合に返します。これはシンボリックリンクをたどるので、同じパスに対して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
FileNotFoundError
あなたはまた、Pythonの2.7と同様にPythonの3をサポートする必要がある場合はPython 3で導入されましたが、あなたが使用することができますIOError
(代わりにFileNotFoundError
サブクラス)stackoverflow.com/a/21368457/1960959
open('file', 'r+')
)し、最後まで検索できます。
あなたは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
使用する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")
os.access()
falseを返します。
import os
あなたはimport os.path
それがすでにの一部であるので、あなたは再びする必要はありませんos
。あなただけの輸入に必要なos.path
だけの機能を使用しようとしている場合os.path
からではなくos
小さい事をインポートするには、それ自身が、あなたが使用してos.access
とos.R_OK
、第二のインポートは必要ありません。
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
ほとんどすべての可能な方法が既存の回答(少なくとも1つ)にリストされていますが(たとえば、Python 3.4固有のものが追加されました)、すべてを一緒にグループ化するようにします。
注:これから投稿するすべてのPython標準ライブラリコードは、バージョン3.5.3に属しています。
問題の説明:
可能な解決策:
[Python 3]:os.path。存在する(パス)(またのような他の機能ファミリーのメンバーを確認しos.path.isfile
、os.path.isdir
、os.path.lexists
わずかに異なる行動のために)
os.path.exists(path)
パスが既存のパスまたは開いているファイル記述子を参照している
True
かどうかを返します。False
壊れたシンボリックリンクを返します。一部のプラットフォームでFalse
は、パスが物理的に存在していても、要求されたファイルに対してos.stat()を実行する権限が付与されていない場合、この関数が返されることがあります。
すべて順調ですが、インポートツリーに従っている場合:
os.path
- posixpath.py(ntpath.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。stat(path、*、dir_fd = None、follow_symlinks = True)。したがって、コードはtry / free を除いてですが、フレームスタックの下には(少なくとも)そのようなブロックが1つあります。これは他の関数(を含む os.path.isfile
)にも適用されます。
ボンネットの下に、それはありません正確に同じこと(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
[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。suppress(* exceptions) - 例外を選択的に抑制するために特別に設計されました
しかし、[Python 3]のように、それらはtry / except / else / 最終的にブロックするラッパーのようです:withステートメントは次のように述べています:
ファイルシステムトラバーサル関数(および一致するアイテムの結果を検索)
[Python 3]:os。listdir(path = '。')(または[Python 3]:os。scandir(path = '。') on Python v 3.5 +、backport:[PyPI]:scandir)
内部では、どちらも使用します。
[GitHub]経由:python / cpython-(マスター)cpython / Modules / posixmodule.c
使用SCANDIR()の代わりに、LISTDIRは()ので、大幅に、また、ファイルの種類やファイルの属性情報を必要とするコードのパフォーマンスを向上させることができos.DirEntryは、ディレクトリをスキャンするときに、オペレーティング・システムがそれを提供する場合、この情報を公開するオブジェクト。すべてのos.DirEntryメソッドはシステムコールを実行できますが、is_dir()およびis_file()は通常、シンボリックリンクのシステムコールのみを必要とします。os.DirEntry.stat()は、Unixでは常にシステムコールを必要としますが、Windowsではシンボリックリンクに1つだけ必要です。
os.listdir
(os.scandir
利用可能な場合)glob.glob
)
os.listdir
彼らは我々の問題のために非効率的である(ほとんどの場合)フォルダの上にこれらの反復、以来(非ワイルドカードのような例外があるグロブ私はそれらを主張するつもりはないので、 - @ShadowRangerが指摘したようにビンビン)。言うまでもなく、ファイル名の処理が必要になる場合もあります。
[Python 3]:os。access(path、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が正しく指摘したように、何をしているのかわからない場合は使用しないでください。
注:ネイティブ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です)。
LNX(Ubtu(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()に指定すると、メインプログラム内のシンボルが検索され、プログラムの起動時に読み込まれるすべての共有オブジェクトが続き、フラグRTLD_GLOBALを指定してdlopen()によって読み込まれるすべての共有オブジェクトが続きます。
__declspec(dllexport)
ファイルシステム機能を備えたサードパーティのモジュールをインストールする
ほとんどの場合、上記の方法のいずれかに依存します(わずかなカスタマイズが必要な場合があります)。
一例は次のようになり(再び、勝利特定)[GitHubの]:mhammond / pywin32 -パイソンのWindows(pywin32)拡張のためであり、PythonのオーバーラッパーWINAPI S。
しかし、これは回避策のようなものなので、ここで停止します。
別の(不完全な)回避策(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
Nix(Lnx(Ubtu)):
[cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp\" > /dev/null 2>&1'))" 0 [cfati@cfati-ubtu16x64-0:~]> python3 -c "import os; print(os.system('ls \"/tmp.notexist\" > /dev/null 2>&1'))" 512
結論:
最後のメモ:
glob.iglob
(およびglob.glob
同様)はに基づいているos.scandir
ため、現在は面倒です。10Mファイルのディレクトリで最初のヒットを取得するには、最初のヒットに到達するまでスキャンするだけです。3.6より前でもglob
、ワイルドカードなしのメソッドを使用する場合、関数はスマートです。ヒットが1つだけであることがわかっているため、グロブ処理が単純にos.path.isdir
またはos.path.lexists
(パスがで終わるかどうかに応じて)単純化され/
ます。
os.path.isdir
かos.path.lexist
、Pythonレベルの関数呼び出しと文字列の束であるため)効率的なパスを決定する前の操作は実行可能ですが、追加のシステムコールやI / O作業はありません。
これは、ファイルが存在するかどうかを確認する最も簡単な方法です。ちょうどので、あなたがチェックすると、ファイルが存在しない保証あなたがそれを開くために必要がある場合、それはあるだろうということ。
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の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
tryステートメントを優先します。それはより良いスタイルと見なされ、競合状態を回避します。
それを私の言葉にしないでください。この理論には多くの支持があります。ここにいくつかあります:
try...except
してもその問題の解決には役立ちません。
except:
節に入れると、コードのこの部分で発生した例外によって混乱するメッセージが表示されることです(2番目のエラーは最初のものの処理)。
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を使っているのであれば、あなたは、は、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 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
すると、ファイルがあることを期待してファイルを読み取ろうとし、そうでない場合は例外をキャッチして、意味のあるフォールバック動作を実行します。
読み取る前にファイルが存在することを確認したい場合、そのファイルを削除して、複数のスレッドまたはプロセスを使用している可能性があります。または、別のプログラムがそのファイルを認識しており、削除できる可能性があります。あなたがそれがレースしているので、あなたがそれが存在することを確認するならば、レース状態の前にそれを開くための条件(その存在)の変更。
非常に小さなウィンドウがあり、プログラムが失敗する可能性があるため、競合状態のデバッグは非常に困難です。
しかし、これがあなたの動機である場合、次のコマンドを使用してステートメントの値を取得できます。try
suppress
コンテキストマネージャ。
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
が、a try
を使用しない場合よりも詳細になります。これは実際には、try
Python 3.4以前のバージョンに適用できるPythonのどのレベルでも使用されない唯一の回答であると確信しています。これは、代わりにコンテキストマネージャを使用しているためです。
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-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()を使用してファイルを開く権限があるかどうかを確認する前に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ではありません。 :
この答えは、正当性のない、Python以外のエラーが発生しやすい方法を好むと述べています。低レベルAPIを理解せずに使用することをユーザーに奨励しているようです。
また、無条件にを返すTrue
ことにより、すべての例外(KeyboardInterrupt
およびSystemExit
!を含む)が暗黙的に渡されるようにするコンテキストマネージャも作成します。これは、バグを非表示にするための優れた方法です。
これは、ユーザーに不適切な慣行を採用するように促すようです。
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.exists
ディレクトリなど、ファイルではないものに対してtrueを返します。これにより、誤検知が発生します。推奨する他の回答を参照してくださいos.path.isfile
。
で、ファイルやフォルダのためのテスト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():
...
pathlib
パスのためのpythonのOOPソリューションです。あなたはそれでもっとたくさんのことができます。存在を確認する必要があるだけの場合、利点はそれほど大きくありません。
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'
ファイルのロックが必要な場合、それは別の問題です。
os.path.exists
ディレクトリなど、ファイルではないものに対してtrueを返します。これにより、誤検知が発生します。推奨する他の回答を参照してくださいos.path.isfile
。
filepath
は、適切なタイミングで名前が付けられたリンクを作成し、BAMはターゲットファイルを上書きします。この問題を回避するにopen(filepath, 'wx')
は、try...except
ブロックで行う必要があります。
OSError
場合filepath + '.old'
、「Windowsでは、dstがすでに存在する場合、ファイルであってもOSErrorが発生します。dst時にアトミックな名前変更を実装する方法がない場合があります。既存のファイルに名前を付けます。」
os.replace
移植可能に宛先ファイルのサイレント置換を実行します(これはのos.rename
Linuxの動作と同じです)(宛先名が存在し、ディレクトリである場合にのみエラーになります)。したがって、2.xで立ち往生していますが、Py3ユーザーは数年前から優れた選択肢を持っています。
rename
例では、それはtry
/ で実行する必要がありますexcept
。os.rename
(またはos.replace
最新のPythonでは)アトミックです。チェックして名前を変更すると、不要な競合と追加のシステムコールが発生します。ただやるtry: os.replace(filepath, filepath + '.old') except OSError: pass
あなたはこれを試すことができます(より安全):
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
私は常にtry
and except
ステートメントの使用をお勧めしますが、ここにいくつかの可能性があります(私の個人的なお気に入りはを使用しています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 vs 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)
て問題を特定できるようにします。お役に立てば幸いです。:)
日付: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']}
ファイルを開く場合は、次のいずれかの方法を使用できます。
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!')
更新
混乱を避けるために、そして私が得た答えに基づいて、現在の答えは指定された名前のファイルまたはディレクトリを見つけます。
os.path.exists
ディレクトリなど、ファイルではないものに対してtrueを返します。これにより、誤検知が発生します。推奨する他の回答を参照してくださいos.path.isfile
。
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例外が発生します。
私は約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
次の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()
他の回答に正確に反映されていないもう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):
if (x) return true; else return false;
本当にだけreturn x
です。最後の4行はになることがありreturn os.path.isfile(file_path)
ます。ここでは、関数全体をのように簡略化できますreturn file_path and os.path.isfile(file_path)
。
return x
の場合は注意が必要ですif (x)
。Pythonは空の文字列をFalseと見なします。この場合、ブールではなく空の文字列が返されます。この関数の目的は、常にboolを返すことです。
x
あるos.path.isfile(..)
ことがすでにBOOLですので。
os.path.isfile(None)
例外が発生するため、ifチェックを追加しました。おそらく代わりにtry / exceptでラップすることもできますが、この方法の方がより明示的だと感じました。
return file_path and os.path.isfile(file_path)
Linuxコマンドライン環境用の1行のPythonコマンドを次に示します。私はそんなにホットなバッシュの男ではないので、私はこれは非常に便利です。
python -c "import os.path; print os.path.isfile('/path_to/file.xxx')"
これがお役に立てば幸いです。
[ -f "${file}" ] && echo "file found" || echo "file not found"
(これはと同じですif [ ... ]; then ...; else ...; fi
)。
Pythonの「OS」ライブラリを使用できます。
>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt")
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False
os.path.exists
ディレクトリなど、ファイルではないものに対してtrueを返します。これにより、誤検知が発生します。推奨する他の回答を参照してくださいos.path.isfile
。
exists
。おそらく既存のファイルを開いても安全かどうかを判断することが目的である場合、批判は正当化され、存在することは十分正確ではありません。悲しいことに、OPはどちらが望ましい目標であるかを指定していません(おそらく、今後はそうしません)。
tryステートメントを使用せずに、ファイルが存在するかどうかを確認するにはどうすればよいですか?
2016年にも、これは間違いなく、ファイルが存在するかどうか、およびファイルであるかどうかを確認する最も簡単な方法です。
import os
os.path.isfile('./file.txt') # Returns True if exists, else False
isfile
実際には、内部で使用されるヘルパーメソッドでos.stat
あり、stat.S_ISREG(mode)
その下にあります。これos.stat
は、ファイル、ディレクトリ、ソケット、バッファなどに関する詳細情報を提供する下位レベルの方法です。os.statの詳細はこちら
注:ただし、この方法ではファイルがロックされないため、コードが「チェックの時間から使用の時間」(TOCTTOU)のバグに対して脆弱になる可能性があります。
したがって、例外を発生させることは、プログラムでフロー制御を行うための受け入れ可能なPythonicのアプローチと見なされます。また、if
ステートメントではなく、IOErrorsを使用して欠落ファイルを処理することを検討する必要があります(単なるアドバイス)。
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)
isReadableFile(path,fileName)
に返さTrue
れます