예외없이 파일이 존재하는지 어떻게 확인합니까?


5604

try명령문 을 사용하지 않고 파일이 존재하는지 여부를 어떻게 확인 합니까?


2
이것은 LBYL 토론 대 고전 EAFP 것 같다이 관련 질문 예 참조 : stackoverflow.com/questions/1835756/using-try-vs-if-in-python
matth

또한 디스크에 있는지 (직접 또는 기호 링크로) 존재하는지, 디스크에서 읽을 수 있는지 또는 쓸 수 있는지 알고 싶은 경우에도 관련이 있습니다.
Thorbjørn Ravn Andersen

답변:


5153

당신이 확인하는 이유가 당신과 같은 것을 할 수 있다면 if file_exists: open_it()그것을 try여는 시도 주위 를 사용하는 것이 더 안전 합니다. 확인 후 파일을 열면 파일이 삭제되거나 이동 될 때 또는 파일을 열 때와 열 때 사이에 무언가 위험이 있습니다.

파일을 즉시 열지 않을 경우 사용할 수 있습니다 os.path.isfile

True경로가 기존 일반 파일 인 경우 반환 합니다. 이는 심볼릭 링크를 따르므로 동일한 경로에 대해 islink ()isfile () 이 모두 참일 수 있습니다.

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

40
불행히도 첫 번째 설명 (열기 전에 확인하면 "시도"를 사용하십시오)과 관련하여 'a'모드가 존재하지 않으면 만들어지기 때문에 이전에 존재하는지 확인하기 위해 열려면 작동하지 않습니다.
makapuf

6
참고 FileNotFoundError당신은 또한 파이썬 2.7뿐만 아니라 파이썬 3를 지원해야하는 경우 파이썬 3에서 도입, 사용할 수있는 IOError대신에 (이 FileNotFoundError서브 클래스) stackoverflow.com/a/21368457/1960959
scottclowe

7
@makapuf "업데이트"( open('file', 'r+'))를 위해 연 다음 끝까지 찾을 수 있습니다.
kyrill

2
@kyrill open-and-seek-to-the-end는 open-for-append와 동일하지 않습니다 (적어도 posix 시스템에서는). "첨부 모드"는 파일이 열릴 때와 쓰기가 발생할 때 사이에 다른 것들이 파일을 수정하더라도 항상 파일 끝에 올바르게 씁니다. 여러 파일이 동시에 같은 파일에 쓰려고하면 쓰기 / 업데이트를 열고 끝까지 찾으려하면 파일 데이터가 손상 될 수 있습니다. 불행히도, 파일이 먼저 존재하는지 확인하면서 파일을 열기 위해 경쟁 조건에 안전한 유일한 방법은 하위 레벨 os.open () 루틴을 대신 사용하는 것입니다 (O_CREAT가없는 O_APPEND).
Foogod

1
구현 의존적 행동처럼 들리는 @LorinczyZsigmond. 소스를 공유 하시겠습니까?
키릴

2111

당신은 os.path.exists기능이 있습니다 :

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

이것은 True파일과 디렉토리 모두에 대해 반환 하지만 대신 사용할 수 있습니다

os.path.isfile(file_path)

구체적으로 파일인지 테스트합니다. 심볼릭 링크를 따릅니다.


965

달리 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

623
import os.path

if os.path.isfile(filepath):

320

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")

60
여러 조건을 갖는 경우 (일부는 불필요) 명확하고 명시 적입니다.
wim

10
또한 중복됩니다. 파일이 존재하지 않으면 os.access()false를 반환합니다.
user207421

9
@EJP 리눅스 파일에는 존재할 수 있지만 접근 할 수는 없습니다.
e-info128

8
당신 은 이미 그것의 일부이므로 다시 import os할 필요가 없습니다 . 당신은 가져와야 만에서 기능을 사용하려는 경우 에서가 아니라 작은 일을 가져, 그 자체,하지만 당신은 사용으로 하고 , 두 번째 수입은 필요하지 않습니다. import os.pathosos.pathos.pathosos.accessos.R_OK
Jester

286
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

2
일반적으로 메소드 이름과 동일한 변수 이름을 지정하는 것은 좋지 않습니다.
Homunculus Reticulli

245

거의 모든 가능한 방법이 기존 답변 (예 : Python 3.4 관련 항목이 추가됨) 에 나열되어 있지만 모든 것을 함께 그룹화하려고 시도합니다.

참고 : 게시 할 모든 Python 표준 라이브러리 코드는 버전 3.5.3에 속합니다 .

문제 진술 :

  1. 파일 점검 ( 논쟁의 여지 : 폴더 ( "특별한"파일)?) 존재
  2. try / except / else / finally 블록을 사용하지 마십시오

가능한 해결책 :

  1. [파이썬 3] : os.path. 존재 ( 경로 ) (또한 같은 다른 기능 가족 구성원을 확인 os.path.isfile, os.path.isdir, os.path.lexists약간 다른 행동에 대한)

    os.path.exists(path)

    path 가 기존 경로 또는 열린 파일 설명자를 참조 True하면 반환 합니다 . 깨진 심볼릭 링크를 반환 합니다. 일부 플랫폼에서이 함수는 경로가 실제로 존재 하더라도 요청 된 파일에서 os.stat () 를 실행할 수 있는 권한이 부여되지 않은 경우 반환 될 수 있습니다.FalseFalse

    모두 좋지만 가져 오기 트리를 따르는 경우 :

    • 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 ) 에도 적용됩니다 .

    1.1. [파이썬 3] : 경로. is_file ()

    • 경로를 다루는 더 환상적인 (그리고 더 많은 파이썬 ic) 방법 이지만
    • 후드에서 정확히 똑같은 일을합니다 ( 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
  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를 사용하십시오 . suppress ( * exceptions ) - 예외 를 선택적으로 억제하기 위해 특별히 고안되었습니다.


    그러나, 그들은 이상 래퍼 것으로 보인다 시도 / 제외 / 다른 / 마지막 블록으로 [파이썬 3] : 사진 상태 :

    이것은 일반적인 수 있습니다 시도 ... 제외 ... 마지막으로 편리하게 재사용을 위해 캡슐화하는 사용 패턴을.

  3. 파일 시스템 탐색 기능 (및 일치하는 항목에 대한 결과 검색)


    그들은 우리의 문제에 대한 비효율적이다 (대부분의 경우) 폴더를 통해 이러한 반복 할 때문에 (비 와일드 카드 같은 예외가 있습니다 글로브의 내가 그들 주장하지 않을거야, 그래서 - @ShadowRanger는 지적 빙). 경우에 따라 파일 이름 처리가 필요할 수 있습니다.

  4. [파이썬 3] : os. access ( path, mode, *, dir_fd = None, effective_ids = False, follow_symlinks = True ) 동작이 가까운 os.path.exists(실제로는 주로 두 번째 인수 때문에 더 넓 습니다 )

    • doc 상태에 따라 사용자 권한으로 파일 "visibility"가 제한 될 수 있습니다.

      ... 호출 사용자에게 지정된 path 액세스 권한이 있는지 테스트하십시오 . 경로가 있는지 테스트하려면 modeF_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 )
    • 내가 사용하고 _waccess을 에 동일한 코드가 작동하도록 Python3Python2 (에도 불구하고 유니 코드가 그들 사이의 차이를 관련)
    • 이것은 매우 구체적인 영역을 목표로하지만 이전 답변에서는 언급되지 않았습니다.


    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 ()에 의해로드 된 모든 공유 객체 를 검색합니다 .

      • 메인 (현재) 프로그램 ( python )은 libc에 연결되어 있으므로 심볼 ( 액세스 포함 ) 이로 드됩니다
      • main , Py_Main 및 기타 기능과 같은 기능을 사용할 수 있으므로주의해서 다루어야 합니다. 그것들을 호출하면 비참한 영향을 줄 수 있습니다 (현재 프로그램에서)
      • 이것은 또한 적용되지 않습니다 (하지만 이후 즉, 같은 큰 문제가 아니다 MSVCRT.DLL가 에 위치한 "% SYSTEMROOT % \ SYSTEM32"% 경로 % 기본적으로). 더 나아가서 Win 에서이 동작을 복제 하고 패치를 제출하고 싶었지만 , [MS.Docs] : GetProcAddress 함수내 보낸 심볼 만 "보여" , 누군가가 주 실행 파일에서 함수를 선언하지 않는 한 로 __declspec(dllexport)(지구에있는 이유는 일반 사람이 그렇게 할 것?)는 메인 프로그램은로드 할 수 있지만, 거의 사용할 수 없습니다
  5. 파일 시스템 기능이있는 일부 타사 모듈 설치

    대부분 위의 방법 중 하나에 의존 할 것입니다 (약간의 사용자 정의가있을 수 있음).
    하나의 예는 (다시 Win에 따라) [GitHub] : mhammond / pywin32-Windows 용 Python (pywin32) ExtensionsWINAPIPython 래퍼 입니다.

    그러나 이것은 해결 방법과 비슷하기 때문에 여기서 멈 춥니 다.

  6. 또 다른 (불충분 한) 해결 방법 ( 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

결론 :

  • 수행 사용 시도 / 제외시켰다 / 다른 / 마침내 그들은 당신이 불쾌한 일련의 문제로 실행되지 않도록 할 수 있기 때문에, 블록. 제가 생각할 수있는 반례는 성능입니다. 이러한 블록은 비용이 많이 들기 때문에 초당 수십만 번 실행되도록 코드에 배치하지 마십시오 (그러나 대부분의 경우 디스크 액세스가 필요합니다. 그렇지 않습니다).

최종 메모 :

  • 나는 그것을 최신 상태로 유지하려고 노력할 것입니다, 어떤 제안이라도 환영합니다, 나는 대답에 올 수있는 유용한 것을 통합 할 것입니다

3
이 진술에 대해 자세히 설명해 주시겠습니까? "좋은 방법은 아니지만, 호출에 os.F_OK를 사용하고 있지만, 이는 명확성을위한 것입니다 (값은 0 임)"
sk8asd123

6
@ sk8asd123 : 주석에 두 가지를 말하기가 어렵습니다. 일반적으로 함수와 함께 상수를 사용하는 것이 가장 좋습니다. 동일한 상수를 정의하는 여러 모듈로 작업 할 때 적용됩니다. 일부는 최신 상태가 아닐 수 있으므로 함수와 상수가 동기화되는 것이 가장 좋습니다. ctypes로 작업 할 때 (함수를 직접 호출) 상수를 정의 했거나 ( MSDN에서 ) 상수를 전혀 사용하지 않아야합니다. 그것은 내가 사용하는 지침 일뿐이며 99.9 %에서는 (기능적으로) 차이가 없을 것입니다.
CristiFati

3
@CristiFati : 3.6 기준으로 glob.iglob(그리고 glob.glob) 또한 기반으로os.scandir 하므로 이제 게으르다. 10M 파일 디렉토리에서 첫 번째 적중을 얻으려면 첫 번째 적중에 도달 할 때까지만 스캔하십시오. 심지어 사전 3.6을 사용하는 경우 glob/ O를 어떤 와일드 카드 w 방법을, 함수는 똑똑하다 : 그래서, 당신은 하나 개의 히트를 가질 수 있습니다 알고 는 단지에 글 로빙 단순화 os.path.isdir또는os.path.lexists (이든 경로 종료에 따라 /).
ShadowRanger

3
내 의견의 두 번째 부분 (와일드 카드가 아닌 글 로빙은 실제로 폴더를 반복하지 않으며 결코 가지고 있지 않음)은 문제에 대한 완벽하게 효율적인 솔루션임을 의미합니다 (직접 호출하는 것보다 느리 os.path.isdir거나 os.path.lexist파이썬 수준의 함수 호출 및 문자열이기 때문에 느립니다) 효율적인 경로를 결정하기 전에는 작동하지만 추가 시스템 호출이나 I / O 작업은 수십 배 느립니다.
ShadowRanger

154

파일이 존재하는지 확인하는 가장 간단한 방법입니다. 그냥 있기 때문에 당신이하지 않는을 선택하면 파일이 존재 보장 당신이 그것을 열 필요가 때이 될 것입니다.

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")

17
파일에 액세스하려는 한 프로그램 구성 방법에 관계없이 경쟁 조건 이 존재합니다 . 프로그램은 컴퓨터의 다른 프로세스가 파일을 수정하지 않았 음을 보증하지 않습니다. 에릭 리퍼 트 ​​(Eric Lippert)가 외인성 예외 라고 말합니다 . 파일의 존재 여부를 미리 확인하여 피할 수 없습니다.
Isaac Supeene

@IsaacSupeene 모범 사례는 (파일) 작업 창을 가능한 한 작게
만들고

145

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

124

try 문을 선호하십시오. 더 나은 스타일로 간주되며 경쟁 조건을 피합니다.

내 말을 받아들이지 마 이 이론에 대한 많은 지원이 있습니다. 몇 가지 있습니다 :


3
진술을 뒷받침 할 수있는 더 나은 출처를 추가하십시오.
BlueTrin

11
인용 된 경쟁 조건 방지 (애플 개발자 지원) 링크는 답변을 지원하지 않습니다. 제한된 권한을 통해 임시 파일 / 디렉토리를 올바르게 샌드 박스 화하지 않는 잘못 설계된 운영 체제에 대한 중요한 정보가 포함 된 임시 파일 만 사용합니다. 사용하여 try...except해결하는 데 도움이되지 않습니다 문제 어쨌든.
jstine

이 방법의 문제점은 존재하지 않는 파일에 따라 중요한 코드가있는 경우 except:절에 넣으면 코드 의이 부분에서 발생하는 예외로 인해 혼란스러운 메시지가 발생한다는 것입니다 (두 번째 오류는
Camion

119

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파일을 읽으려고 시도하고 파일이있을 것으로 예상하고 그렇지 않은 경우 예외를 포착하고 대체 동작이 의미가있는 모든 것을 수행합니다.

파일을 읽기 전에 파일이 존재하는지 확인하고 파일을 삭제 한 후 여러 스레드 또는 프로세스를 사용 중이거나 다른 프로그램이 해당 파일에 대해 알고이를 삭제할 수있는 경우 경쟁 조건 은 다음 있기 때문에 당신이 그것을 존재를 확인하면 경주 의 전에 열 조건 (의 존재)을 변경합니다.

경쟁 조건은 프로그램이 실패 할 수있는 매우 작은 창이 있으므로 디버깅하기가 매우 어렵습니다.

그러나 이것이 동기 부여 인 경우 컨텍스트 관리자 를 사용하여 명령문 의 가치를 얻을 수 있습니다 .trysuppress

try 문없이 경쟁 조건 피하기 : 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하여 모든 예외 ( KeyboardInterruptSystemExit ! )를 자동으로 전달할 버그를 숨길 수 있습니다.

이것은 사용자가 열악한 관행을 채택하도록 장려하는 것 같습니다.


87
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.


9
이 답변은 잘못되었습니다. os.path.exists디렉토리와 같이 파일이 아닌 것들에 대해서는 true를 반환합니다. 이것은 오 탐지를 제공합니다. 추천하는 다른 답변을 참조하십시오 os.path.isfile.
Chris Johnson

84

와 파일 및 폴더에 대한 테스트 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

72

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():
    ...

3
python3에서 모듈 'os'대신 'pathlib'모듈을 사용하면이 검사에 이점이 있습니까?
Joko

3
pathlib경로에 대한 파이썬의 OOP 솔루션입니다. 당신은 그것으로 더 많은 것을 할 수 있습니다. 존재 여부 만 확인하면 이점이 그리 크지 않습니다.
KaiBuxe

65

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'

파일 잠금이 필요한 경우 다른 문제입니다.


3
이 답변은 잘못되었습니다. os.path.exists디렉토리와 같이 파일이 아닌 것들에 대해서는 true를 반환합니다. 이것은 오 탐지를 제공합니다. 추천하는 다른 답변을 참조하십시오 os.path.isfile.
Chris Johnson

6
세 번째 예에서는 filepath올바른 타이밍으로 이름 지정된 링크를 작성 하고 BAM 에서는 대상 파일을 겹쳐 씁니다. 당신은 어떻게해야 open(filepath, 'wx')A의 try...except문제를 방지하기 위해 블록.
스펙트럼

1
두 번째 예에서는 최소한 Windows에서는 이미 존재 하는 OSError경우 다음과 같은 결과를 얻습니다 filepath + '.old'. "Windows의 경우 dst가 이미 존재하면 파일 인 경우에도 OSError가 발생합니다. dst 일 때 원자 이름 바꾸기를 구현할 방법이 없을 수 있습니다 기존 파일의 이름을 지정합니다. "
Tom Myddeltyn

@TomMyddeltyn : Python 3.3os.replace 부터는 대상 파일의 자동 교체를 수행 os.rename할 수 있습니다 ( 'Linux 동작 과 동일 ) (대상 이름이 존재하고 디렉토리 인 경우에만 오류가 발생 함). 따라서 2.x를 사용하고 있지만 Py3 사용자는 몇 년 동안 좋은 옵션을 가지고 있습니다.
ShadowRanger

rename예 : 그것은 여전히으로 수행해야합니다 try/ except. os.rename(또는 os.replace현대 파이썬에서는) 원자 적입니다. 확인 후 이름을 바꾸면 불필요한 경쟁과 추가 시스템 호출이 발생합니다. 그냥하세요try: os.replace(filepath, filepath + '.old') except OSError: pass
ShadowRanger

59

이것을 시도 할 수 있습니다 (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')

그런 다음 결과에 따라 프로그램이 계속 실행되거나 원하는 경우 중지하도록 코드를 작성할 수 있습니다.


18
원래 질문은 사용하지 않는 솔루션을 요청했습니다try
rrs

5
이 답변은 OP의 요점을 놓치고 있습니다. 파일이 존재하는지 확인하는 것은 파일을 열 수 있는지 확인하는 것과 다릅니다. 파일이 존재하는 경우가 있지만 여러 가지 이유로 파일을 열 수 없습니다.
크리스 존슨

51

항상 사용 try하고 except진술하는 것이 좋지만 다음은 몇 가지 가능성입니다 (개인적으로 가장 좋아하는 것은 os.access).

  1. 파일을 열어보십시오 :

    파일을 열면 항상 파일이 있는지 확인합니다. 다음과 같이 기능을 만들 수 있습니다.

    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
  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하면 경로가 있는지 확인합니다. 그러나이 권한을 사용하면 권한 확인과 파일 열기 사이의 시간을 사용하여 파일을 공격 할 수 있으므로 보안 허점이 생깁니다. 대신 사용 권한을 확인하는 대신 파일을 직접 열어야합니다. ( EAFPLBYP ). 나중에 파일을 열지 않고 존재 여부 만 확인하는 경우이 파일을 사용할 수 있습니다.

    어쨌든, 여기 :

    >>> 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)문제를 파악할 수 있도록 입력 하십시오. 도움이 되길 바랍니다! :)


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']}

37

파일을 여는 경우 다음 기술 중 하나를 사용할 수 있습니다.

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!')

최신 정보

혼란을 피하고 내가 얻은 답변을 기반으로 현재 답변은 파일 이나 주어진 이름의 디렉토리를 찾습니다 .


9
이 답변은 잘못되었습니다. os.path.exists디렉토리와 같이 파일이 아닌 것들에 대해서는 true를 반환합니다. 이것은 오 탐지를 제공합니다. 추천하는 다른 답변을 참조하십시오 os.path.isfile.
Chris Johnson

거짓 긍정 문제도 있습니다.
Zorglub29

docs.python.org/3/library/os.path.html#os.path.exists chris >> os.path.exists (path) 에서 위의 문장으로 > path가 기존 경로 또는 열린 경로를 참조하면 True를 반환합니다. 파일 기술자. 깨진 심볼릭 링크에 대해 False를 반환합니다. 일부 플랫폼에서 물리적으로 경로가 존재하더라도 요청 된 파일에서 os.stat ()를 실행할 권한이 부여되지 않은 경우이 함수는 False를 반환 할 수 있습니다. 버전 3.3으로 변경 : path는 이제 정수가 될 수 있습니다. 열린 파일 디스크립터이면 True가 반환되고, 그렇지 않으면 False가 반환됩니다. 버전 3.6으로 변경 : 경로와 유사한 객체를 받아들입니다.
JayRizzo

36

또한 os.access():

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

이어서 R_OK, W_OKX_OK테스트에 플래그 권한 (대한 의사 ).


20
if os.path.isfile(path_to_file):
    try: 
        open(path_to_file)
            pass
    except IOError as e:
        print "Unable to open file"

예외를 발생시키는 것은 프로그램에서 흐름 제어를 위해 허용 가능한 파이썬 방식으로 간주됩니다. IOError로 누락 된 파일 처리를 고려하십시오. 이 상황에서는 파일이 있지만 사용자에게 읽기 권한이없는 경우 IOError 예외가 발생합니다.

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


3
OP는 파일이 있는지 확인하는 방법을 묻습니다. 파일이 존재할 수는 있지만 열 수는 없습니다. 따라서 파일이 존재하는지 확인하기 위해 프록시로 파일 열기를 사용하는 것이 올바르지 않습니다. 잘못된 부정이 있습니다.
크리스 존슨

19

당신이 다른 목적을 위해 이미 NumPy와를 가져온 경우 다음과 같은 다른 라이브러리를 가져올 필요가 없습니다 pathlib, os, paths, 등

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

존재 여부에 따라 true 또는 false를 반환합니다.


18

당신은없이 브라이언의 제안을 쓸 수 있습니다 try:.

from contextlib import suppress

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

suppress파이썬 3.4의 일부입니다. 이전 릴리스에서는 자신 만의 억제를 빠르게 작성할 수 있습니다.

from contextlib import contextmanager

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

17

나는 약 10 년 동안 사용되어 온 패키지의 저자 이며이 질문을 직접 해결하는 기능을 가지고 있습니다. 기본적으로 Windows 이외의 시스템 인 경우 Popen에 액세스 하는 데 사용 됩니다 find. 그러나 Windows를 find사용하는 경우 효율적인 파일 시스템 워커로 복제 됩니다.

코드 자체는 try블록을 사용하지 않습니다 … 운영 체제를 결정하고 "Unix"스타일 find또는 핸드 빌트로 안내하는 경우를 제외하고 find. 타이밍 테스트는 tryOS를 결정하는 데 더 빠르다 는 것을 보여 주었 으므로 거기에서 하나를 사용했습니다 (그러나 다른 곳은 없습니다).

>>> 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에 있습니다.


17

파일 또는 디렉토리 확인

다음 세 가지 방법을 수행 할 수 있습니다.

참고 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()

16

다른 답변에 정확하게 반영되지 않은 약간의 변형을 추가하십시오.

이것은 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):

3
if (x) return true; else return false;정말 return x입니다. 마지막 네 줄이 될 수 있습니다 return os.path.isfile(file_path). 우리가 그 동안 전체 기능을로 단순화 할 수 있습니다 return file_path and os.path.isfile(file_path).
Shahbaz

return x의 경우 주의해야합니다 if (x). 파이썬은 빈 문자열 False를 고려할 것입니다.이 경우 bool 대신 빈 문자열을 반환합니다. 이 함수의 목적은 항상 bool을 반환하는 것입니다.
Marcel Wilson

1
진실. 그러나이 경우, x이다 os.path.isfile(..)이미 bool에 그래서.
Shahbaz

os.path.isfile(None)if 체크를 추가 한 이유는 예외입니다. 나는 그것을 대신 시도 / 제외로 포장 할 수는 있지만이 방법으로 더 분명하다고 느꼈습니다.
Marcel Wilson

3
return file_path and os.path.isfile(file_path)
피터 우드

15

다음은 Linux 명령 행 환경을위한 1 행 Python 명령입니다. 나는 그렇게 뜨거운 배쉬 사람이 아니기 때문에이 매우 손디를 찾으십시오.

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

도움이 되길 바랍니다.


6
bash의 한 줄 검사 : [ -f "${file}" ] && echo "file found" || echo "file not found"(와 동일 if [ ... ]; then ...; else ...; fi).
flotzilla

12

파이썬의 "OS"라이브러리를 사용할 수 있습니다 :

>>> import os
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.txt") 
True
>>> os.path.exists("C:\\Users\\####\\Desktop\\test.tx")
False

5
이 답변은 잘못되었습니다. os.path.exists디렉토리와 같이 파일이 아닌 것들에 대해서는 true를 반환합니다. 이것은 오 탐지를 제공합니다. 추천하는 다른 답변을 참조하십시오 os.path.isfile.
Chris Johnson

@Chris Johnson, os.path.exists () 함수는 시스템에 경로가 있는지 확인합니다. PATH는 DIRECTORY 또는 FILE 일 수 있습니다. 두 경우 모두 잘 작동합니다. 예를 들어보십시오
Pradip Das

따라서이 답변이 효과가 있습니다. 큰. IFF 경로하지 그 파일이다. 그 질문에 관한 것입니까? No.
Debosmit Ray

때에 따라 다르지. "파일"의 존재를 결정하는 목적이 경로가 이미 존재하는지 (따라서 다른 정보를 삭제하지 않고 새 데이터를 저장할 수있는 경로가 아닌지) 확인하는 것이라면 exists괜찮습니다. 아마도 존재하는 파일을 여는 것이 안전한지 결정하는 것이 목표라면, 비판은 정당화되고 존재하는 것으로 충분하지 않습니다. 안타깝게도 OP는 원하는 목표를 지정하지 않으며 더 이상 그렇게하지 않을 것입니다.
starturtle

12

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로 누락 된 파일을 처리하는 것을 고려해야 합니다 ( 단지 조언 ).


9
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)

@ j6m8 yes, 프로세스 \ 프로그램 \ 스레드에서 파일에 도달하고 읽을 수있는 경우 isReadableFile(path,fileName)반환 True됩니다.
Khaled.K
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.