try
명령문 을 사용하지 않고 파일이 존재하는지 여부를 어떻게 확인 합니까?
try
명령문 을 사용하지 않고 파일이 존재하는지 여부를 어떻게 확인 합니까?
답변:
당신이 확인하는 이유가 당신과 같은 것을 할 수 있다면 if file_exists: open_it()
그것을 try
여는 시도 주위 를 사용하는 것이 더 안전 합니다. 확인 후 파일을 열면 파일이 삭제되거나 이동 될 때 또는 파일을 열 때와 열 때 사이에 무언가 위험이 있습니다.
파일을 즉시 열지 않을 경우 사용할 수 있습니다 os.path.isfile
True
경로가 기존 일반 파일 인 경우 반환 합니다. 이는 심볼릭 링크를 따르므로 동일한 경로에 대해 islink () 및 isfile () 이 모두 참일 수 있습니다.
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
당신은 또한 파이썬 2.7뿐만 아니라 파이썬 3를 지원해야하는 경우 파이썬 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
거의 모든 가능한 방법이 기존 답변 (예 : Python 3.4 관련 항목이 추가됨) 에 나열되어 있지만 모든 것을 함께 그룹화하려고 시도합니다.
참고 : 게시 할 모든 Python 표준 라이브러리 코드는 버전 3.5.3에 속합니다 .
문제 진술 :
가능한 해결책 :
[파이썬 3] : os.path. 존재 ( 경로 ) (또한 같은 다른 기능 가족 구성원을 확인 os.path.isfile
, os.path.isdir
, os.path.lexists
약간 다른 행동에 대한)
os.path.exists(path)
path 가 기존 경로 또는 열린 파일 설명자를 참조
True
하면 반환 합니다 . 깨진 심볼릭 링크를 반환 합니다. 일부 플랫폼에서이 함수는 경로가 실제로 존재 하더라도 요청 된 파일에서 os.stat () 를 실행할 수 있는 권한이 부여되지 않은 경우 반환 될 수 있습니다.False
False
모두 좋지만 가져 오기 트리를 따르는 경우 :
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 ) . 따라서 코드는 무료 / 시도를 제외하고 시도 하지만 프레임 스택에는 (적어도) 그러한 블록이 하나 이상 있습니다. 이는 다른 기능 (을 포함한 os.path.isfile
) 에도 적용됩니다 .
후드에서 정확히 똑같은 일을합니다 ( pathlib.py , line ~ # 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 ) - 예외 를 선택적으로 억제하기 위해 특별히 고안되었습니다.
그러나, 그들은 이상 래퍼 것으로 보인다 시도 / 제외 / 다른 / 마지막 블록으로 [파이썬 3] : 사진 에 문 상태 :
이것은 일반적인 수 있습니다 시도 ... 제외 ... 마지막으로 편리하게 재사용을 위해 캡슐화하는 사용 패턴을.
파일 시스템 탐색 기능 (및 일치하는 항목에 대한 결과 검색)
[파이썬 3] : os. 은 listDir ( 경로 = '.' ) (또는 [파이썬 3]. OS 위해 scandir ( '.'= 패스 ) 에 파이썬 V 3.5 +, 백 포트 : [PyPI] 위해 scandir )
후드 아래에서 다음을 모두 사용하십시오.
[GitHub] 를 통해 : python / cpython-(마스터) cpython / Modules / posixmodule.c
os.DirEntry 객체는 디렉토리를 스캔 할 때 운영 체제에서 정보를 제공하면 os.DirEntry 객체가이 정보를 노출 하므로 listdir () 대신 scandir ()을 사용하면 파일 유형 또는 파일 속성 정보가 필요한 코드의 성능이 크게 향상 될 수 있습니다 . 모든 os.DirEntry 메소드는 시스템 호출을 수행 할 수 있지만 is_dir () 및 is_file ()은 일반적으로 기호 링크에 대한 시스템 호출 만 필요합니다. os.DirEntry.stat ()는 항상 Unix에서 시스템 호출이 필요하지만 Windows에서는 기호 링크에 대한 호출 만 필요합니다.
os.listdir
( 사용 os.scandir
가능한 경우)glob.glob
)
os.listdir
그들은 우리의 문제에 대한 비효율적이다 (대부분의 경우) 폴더를 통해 이러한 반복 할 때문에 (비 와일드 카드 같은 예외가 있습니다 글로브의 내가 그들 주장하지 않을거야, 그래서 - @ShadowRanger는 지적 빙). 경우에 따라 파일 이름 처리가 필요할 수 있습니다.
[파이썬 3] : os. access ( path, mode, *, dir_fd = None, effective_ids = False, follow_symlinks = True ) 동작이 가까운 os.path.exists
(실제로는 주로 두 번째 인수 때문에 더 넓 습니다 )
... 호출 사용자에게 지정된 path 액세스 권한이 있는지 테스트하십시오 . 경로가 있는지 테스트하려면 mode 는 F_OK 여야합니다 .
os.access("/tmp", os.F_OK)
나는 또한 작업 때문에 C , 후드, 그것을 호출하기 때문에 나뿐만 아니라이 방법을 사용하는 네이티브 API 의 (통해, 다시 "$ {PYTHON_SRC_DIR} /Modules/posixmodule.c" )뿐만 아니라 수에 대한 게이트 열립니다 사용자 errors 이며 다른 변형 만큼 Python ic 이 아닙니다 . 따라서 @AaronHall이 올바르게 지적했듯이 수행중인 작업을 모르는 경우 사용하지 마십시오.
참고 : [Python 3]을 통해 네이티브 API를 호출 할 수도 있습니다 . 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 64) 뿐만 아니라) 상대 :
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 생성자에 None (또는 빈 문자열)을 전달할 수 있습니다. ( ). [man7] 에 따르면 : DLOPEN (3) :ctypes.CDLL(None).access(b"/tmp", os.F_OK)
경우 파일 이름이 NULL이고, 다음 반환 된 핸들은 메인 프로그램입니다. dlsym ()이 주어지면 이 핸들은 기본 프로그램에서 기호를 찾은 다음 프로그램 시작시로드 된 모든 공유 객체 와 RTDL_GLOBAL 플래그 로 dlopen ()에 의해로드 된 모든 공유 객체 를 검색합니다 .
__declspec(dllexport)
(지구에있는 이유는 일반 사람이 그렇게 할 것?)는 메인 프로그램은로드 할 수 있지만, 거의 사용할 수 없습니다파일 시스템 기능이있는 일부 타사 모듈 설치
대부분 위의 방법 중 하나에 의존 할 것입니다 (약간의 사용자 정의가있을 수 있음).
하나의 예는 (다시 Win에 따라) [GitHub] : mhammond / pywin32-Windows 용 Python (pywin32) Extensions 는 WINAPI 의 Python 래퍼 입니다.
그러나 이것은 해결 방법과 비슷하기 때문에 여기서 멈 춥니 다.
또 다른 (불충분 한) 해결 방법 ( gainarie )은 sysadmin 접근 방식입니다 ( 파이썬 을 래퍼로 사용하여 쉘 명령 실행)
승리 :
(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
닉스 ( 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
/ O를 어떤 와일드 카드 w 방법을, 함수는 똑똑하다 : 그래서, 당신은 하나 개의 히트를 가질 수 있습니다 알고 는 단지에 글 로빙 단순화 os.path.isdir
또는os.path.lexists
(이든 경로 종료에 따라 /
).
os.path.isdir
거나 os.path.lexist
파이썬 수준의 함수 호출 및 문자열이기 때문에 느립니다) 효율적인 경로를 결정하기 전에는 작동하지만 추가 시스템 호출이나 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:
절에 넣으면 코드 의이 부분에서 발생하는 예외로 인해 혼란스러운 메시지가 발생한다는 것입니다 (두 번째 오류는
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
구현의 모든 곳에서 사용한다는 사실이 있습니다.
파이썬은 try
모든 곳에서 사용하기 때문에 그것을 사용하는 구현을 피할 이유가 없습니다.
그러나이 답변의 나머지 부분은 이러한주의 사항을 고려하려고합니다.
Python 3.4부터 사용할 수있는의 새 Path
객체를 사용하십시오 pathlib
. .exists
디렉토리는 파일이 아니기 때문에 옳지 않다는 점 에 유의 하십시오 (유닉스 의미에서는 모든 것이 파일 이라는 것을 제외하고 ).
>>> 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
파이썬 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()
...
>>>
초기 파이썬의 경우 자신 만 롤링 할 수 suppress
있지만 try
의지가 없는 것보다 더 장황합니다. 나는 이것이 실제로try
컨텍스트 관리자를 사용하기 때문에 파이썬 3.4 이전에 적용될 수있는 파이썬의 어떤 수준에서도 사용하지 않는 유일한 대답 이라고 생각 합니다 .
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:
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
있습니다. 로부터 문서 :
참고 : open ()을 사용하여 실제로 파일을 열 수있는 권한이 있는지 확인하기 위해 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
! )를 자동으로 전달할 버그를 숨길 수 있습니다.
이것은 사용자가 열악한 관행을 채택하도록 장려하는 것 같습니다.
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
사용하면 운영 체제에서보다 쉽게 탐색하고 표준 조치를 수행 할 수 있습니다.
참고로 파이썬을 사용하여 파일이 있는지 확인하는 방법을 참조하십시오 .
높은 수준의 작업이 필요한 경우을 사용하십시오 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')
또는 파이썬 3에서는 다음을 사용할 수 있습니다 pathlib
.
import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
...
pathlib
경로에 대한 파이썬의 OOP 솔루션입니다. 당신은 그것으로 더 많은 것을 할 수 있습니다. 존재 여부 만 확인하면 이점이 그리 크지 않습니다.
try / except와 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')
A의 try...except
문제를 방지하기 위해 블록.
OSError
경우 다음과 같은 결과를 얻습니다 filepath + '.old'
. "Windows의 경우 dst가 이미 존재하면 파일 인 경우에도 OSError가 발생합니다. dst 일 때 원자 이름 바꾸기를 구현할 방법이 없을 수 있습니다 기존 파일의 이름을 지정합니다. "
os.replace
부터는 대상 파일의 자동 교체를 수행 os.rename
할 수 있습니다 ( 'Linux 동작 과 동일 ) (대상 이름이 존재하고 디렉토리 인 경우에만 오류가 발생 함). 따라서 2.x를 사용하고 있지만 Py3 사용자는 몇 년 동안 좋은 옵션을 가지고 있습니다.
rename
예 : 그것은 여전히으로 수행해야합니다 try
/ except
. os.rename
(또는 os.replace
현대 파이썬에서는) 원자 적입니다. 확인 후 이름을 바꾸면 불필요한 경쟁과 추가 시스템 호출이 발생합니다. 그냥하세요try: os.replace(filepath, filepath + '.old') except OSError: pass
이것을 시도 할 수 있습니다 (safer) :
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
하고 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 대 LBYP ). 나중에 파일을 열지 않고 존재 여부 만 확인하는 경우이 파일을 사용할 수 있습니다.
어쨌든, 여기 :
>>> import os
>>> os.access("/is/a/file.txt", os.F_OK)
True
또한 파일의 존재를 확인할 수없는 두 가지 방법이 있습니다. 문제는 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"
예외를 발생시키는 것은 프로그램에서 흐름 제어를 위해 허용 가능한 파이썬 방식으로 간주됩니다. IOError로 누락 된 파일 처리를 고려하십시오. 이 상황에서는 파일이 있지만 사용자에게 읽기 권한이없는 경우 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에 있습니다.
다음 세 가지 방법을 수행 할 수 있습니다.
참고 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
방법 (파이썬 포함 3+ 파이썬 2 PIP로 설치)
from pathlib import Path
Path(filename).exists()
다른 답변에 정확하게 반영되지 않은 약간의 변형을 추가하십시오.
이것은 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
입니다. 마지막 네 줄이 될 수 있습니다 return os.path.isfile(file_path)
. 우리가 그 동안 전체 기능을로 단순화 할 수 있습니다 return file_path and os.path.isfile(file_path)
.
return x
의 경우 주의해야합니다 if (x)
. 파이썬은 빈 문자열 False를 고려할 것입니다.이 경우 bool 대신 빈 문자열을 반환합니다. 이 함수의 목적은 항상 bool을 반환하는 것입니다.
x
이다 os.path.isfile(..)
이미 bool에 그래서.
os.path.isfile(None)
if 체크를 추가 한 이유는 예외입니다. 나는 그것을 대신 시도 / 제외로 포장 할 수는 있지만이 방법으로 더 분명하다고 느꼈습니다.
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
).
파이썬의 "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에 대한 자세한 내용은 here
참고 : 그러나이 방법은 파일을 어떤 식 으로든 잠그지 않으므로 코드가 "사용 시간 확인 "( TOCTTOU ) 버그에 취약해질 수 있습니다 .
따라서 예외를 발생시키는 것은 프로그램에서 흐름 제어를 위해 허용 가능한 파이썬 방식으로 간주됩니다. 그리고 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
됩니다.