source

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

factcode 2022. 10. 3. 16:22
반응형

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

스테이트먼트를 사용하지 않고 파일의 존재 여부를 확인하려면 어떻게 해야 합니까?

가 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아if file_exists: open_it() , 을하는 것이합니다.try 후 열될 위험이 .확인 후 열 경우 확인 시부터 열려고 할 때 사이에 파일이 삭제 또는 이동될 위험이 있습니다.

파일을 바로 열지 않을 예정이라면

True경로가 기존 일반 파일인 경우.이것은 심볼릭링크를 따르기 때문에 islink()와 isfile() 모두 같은 경로에 대해 true가 될 수 있습니다.

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

파일인지 확인할 수 있습니다.

Python 3.4부터 모듈은 객체 지향 접근법(로 역포트됨)을 제공합니다.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

a가 합니다.Path 또는 중 어느 쪽이든 합니다.exists():

if my_file.exists():
    # path exists

이 경우에도 하실 수 있습니다.resolve(strict=True)in a a a a try 삭제:

try:
    my_abs_path = my_file.resolve(strict=True)
except FileNotFoundError:
    # doesn't exist
else:
    # exists

파일과 디렉토리를 모두 확인하는 데 사용합니다.

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

파일만 확인하는 데 사용합니다(참고: 심볼 링크를 따릅니다).

os.path.isfile(file_path)

와는 달리는 반환됩니다.True를 참조해 주세요. 일반 도 사용할지에 isfile() ★★★★★★★★★★★★★★★★★」exists()간단한 리플리케이션 출력을 다음에 나타냅니다.

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

와 함께 사용:

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 특정 항목이 추가됨)에 나열되어 있지만, 모든 것을 함께 그룹화해 보겠습니다.

주의: Python 표준 라이브러리 코드는 모두 버전 3.5.3에 속합니다.

문제 설명:

  1. 파일(인수 가능: 폴더("특수" 파일))의 존재를 확인합니다.
  2. try 사용 안 함 / 제외 / else / finally blocks (최종 차단)

가능한 해결책:

  1. [Python 3]: os.path.exists(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).그래서 당신의 코드는 무료가 아닌 무료입니다만, 가장 낮은 프레임스택에는 적어도 하나의 그러한 블록이 있습니다.는 다른 펑크에도 적용됩니다. os.path.isfile를 참조해 주세요.

    1.1 [Python 3] : Path.is_file()

    • 좀 더 세련된(그리고 더 비단어적인) 경로 처리 방법이지만,
    • 후드 아래에서도 동일한 작업을 수행합니다(pathlib.py, 행 ~#1330).

      def is_file(self):
          """
          Whether this path is a regular file (also True for symlinks pointing
          to regular files).
          """
          try:
              return S_ISREG(self.stat().st_mode)
          except OSError as e:
              if e.errno not in (ENOENT, ENOTDIR):
                  raise
              # Path doesn't exist or is a broken symlink
              # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
              return False
      
  2. [Python 3] : 스테이트먼트 컨텍스트 매니저를 사용합니다.다음 중 하나:

    • 다음 중 하나를 만듭니다.

      class Swallow:  # Dummy example
          swallowed_exceptions = (FileNotFoundError,)
      
          def __enter__(self):
              print("Entering...")
      
          def __exit__(self, exc_type, exc_value, exc_traceback):
              print("Exiting:", exc_type, exc_value, exc_traceback)
              return exc_type in Swallow.swallowed_exceptions  # only swallow FileNotFoundError (not e.g. TypeError - if the user passes a wrong argument like None or float or ...)
      
      • 그리고 그 사용법 - 내가 복제해줄게os.path.isfilebehavior(이것은 단지 데모의 목적으로 하는 것이므로, 실가동용으로 그러한 코드를 작성하려고 하지 말아 주세요).

        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(예외) - 예외를 선택적으로 억제하기 위해 특별히 설계되었습니다.


    그러나 [Python 3]와 같이 시도/기타/최종 블록을 제외하고 래퍼처럼 보입니다. with 문장은 다음과 같이 기술되어 있습니다.

    이렇게 하면 일반적인 시도를 할 수 있습니다.다만...마지막으로 편리한 재사용을 위해 사용 패턴을 캡슐화합니다.

  3. 파일 시스템 통과 함수(및 일치하는 항목 검색)


    폴더에서도 반복되기 때문에 (대부분의 경우) 문제에는 비효율적입니다(@ShadowRanger가 지적한 것처럼 와일드카드 이외의 글로벌화 등 예외도 있습니다).따라서 저는 그것들을 고집하지 않습니다.경우에 따라서는 파일명 처리가 필요할 수도 있습니다.

  4. [Python 3]: 동작에 가까운 os.access(패스, 모드, *, dir_fd=없음, 유효_ids=False, follow_symlinks=True)os.path.exists(주로 두 가지 주장이nd 있기 때문에 실제로는 더 넓어짐)

    • 사용자 권한은 문서에 명시된 대로 파일 "가시성"을 제한할 수 있습니다.

      ... 호출하는 사용자가 경로에 대한 지정된 액세스 권한을 가지고 있는지 테스트합니다. 경로의 존재를 테스트하려면 모드가 F_OK여야 합니다.

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

    저도 C에서 일하고 있기 때문에 이 메서드를 사용하고 있습니다.왜냐하면 후드 아래에서는 네이티브 API를 호출하기 때문입니다('${PYthon_SRC_DIR}/Modules/posixmodule.c'를 통해).또, 유저 에러가 발생할 가능성이 있는 게이트도 열리기 때문입니다.또, 다른 바리안트와는 다릅니다.따라서 @Aaron Hall이 올바르게 지적한 바와 같이, 무엇을 하고 있는지 모르는 한 사용하지 마십시오.

    주의: 네이티브 API 호출은 [Python 3]를 통해서도 가능합니다.ctypes - Python 용 외부 함수 라이브러리이지만, 대부분의 경우 더 복잡합니다.

    (특정 당첨):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
    

    주의:

    • 연습은 록록좋좋 although although although although although although although, although although although although although although although although although although although although although although although although although although although although although although although although although although although although although although although이다를 사용하고 있습니다.os.F_OK다만, 이것은 명확화를 위해서입니다(값은 0 입니다.
    • Python3와 Python2에서 동일한 코드가 작동하도록 _waccess를 사용하고 있습니다(유니코드 관련 차이에도 불구하고).
    • 이는 매우 구체적인 영역을 대상으로 하지만 이전 답변에서는 언급하지 않았습니다.


    Lnx(Ubtu(16 x 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-displaces/libc.so).6인치)는 시스템에 따라 다를 수 있으며(대부분 다를 수 있음), 없음(또는 빈 문자열)은 CDLL 컨스트럭터()ctypes.CDLL(None).access(b"/tmp", os.F_OK)에 전달할 수 있습니다.[man7]에 따르면: DLOPEN(3):

      파일명이 NULL인 경우 반환되는 핸들은 메인 프로그램용입니다.dlsym()에 지정하면 이 핸들에 의해 메인 프로그램에서 심볼이 검색되고 이어서 프로그램 시작 시 로드된 모든 공유 객체가 로드된 다음 플래그가 RTLD_GLOBAL인 dlopen()에 의해 로드된 모든 공유 객체가 검색됩니다.

      • 메인(현재) 프로그램(피톤)은 libc에 대해 링크되므로 해당 기호(액세스 포함)가 로드됩니다.
      • 메인, Py_Main 및 (기타)와 같은 기능을 사용할 수 있으므로 이러한 기능을 호출하면 (현재 프로그램에) 치명적인 영향을 미칠 수 있으므로 주의해야 합니다.
      • 이것은 Win에도 해당되지 않습니다(단, msvcrt.dll은 %SystemRoot%에 있기 때문에 큰 문제는 아닙니다).기본적으로 %PATH%에 있는 System32")입니다.Win에서 동작을 재현(및 패치 제출)하고 싶었지만 [MS.Docs]: GetProcAddress 함수는 내보낸 심볼만 "인식"하기 때문에 메인 실행 파일의 함수를 다음과 같이 선언하지 않는 한__declspec(dllexport)(지구상에서 일반인은 왜 그렇게 합니까?) 메인 프로그램은 로딩이 가능하지만 거의 사용할 수 없습니다.
  5. 파일 시스템 기능이 있는 일부 서드파티 모듈을 설치합니다.

    대부분의 경우 위의 방법 중 하나에 의존합니다(약간의 커스터마이즈가 필요한 경우도 있습니다.
    예를 들어 (다시 Win specific) [GitHub] : mhammond / pywin32 - Python for Windows ( pywin32) Extensions 、 WINAPI 의 Python 래퍼입니다.

    하지만, 이것은 회피책에 가깝기 때문에, 여기서 멈추겠습니다.

  6. 또 다른 (lame) 회피책(gainarie)은 sysadmin 어프로치입니다(저는 이것을 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
      

결론:

  • try / else / finally blocks를 사용하면 일련의 심각한 문제에 부딪히는 것을 방지할 수 있으므로 try / else / finally blocks를 사용하십시오.예를 들어 퍼포먼스를 들 수 있습니다.이러한 블록은 비용이 많이 들기 때문에 초당 수십만 번 실행되는 코드에 배치하지 않도록 하십시오(그러나 (대부분의 경우) 디스크 액세스가 수반되므로 그렇지 않습니다).

마지막 메모:

  • 최신 상태로 유지하도록 노력하겠습니다.어떤 제안이라도 환영합니다.해결에 도움이 되는 것은 무엇이든 포함하겠습니다.

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

다음으로 다음과 같이 Import합니다.

# 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를 Import하여 합니다.Path하여 오브젝트를 합니다.is_file해 주세요method(True).

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

Python 2에 있는 경우 pypi 또는 에서 pathlib 모듈을 백포트하거나 다른 방법으로 체크할 수 있습니다.isfile os.path★★★★

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

경우, (무엇을) 조건의 , 그 이 되는 에서는, 「을 달성하려고 하는가에 따라 다릅니다」라고 하는 것이 되고 있습니다.또한 기본 구현에서는try, Python은 ", 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_filetry:

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는 더 적은 행으로 의미론적으로 정확히 동일한 것을 수행하는 컨텍스트 매니저(이전 컨텍스트 매니저)를 제공하며, 또한 (적어도 표면적으로는) 원래의 요구를 충족시킵니다.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더 장황하게 말할 수 있습니다.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

"시도하지 않고" 요청에 부합하지 않는 기타 옵션:

파일

import os
os.path.isfile(path)

다음 문서를 참조해 주세요.

os.path.isfile(path)

참말이다링크를 에 둘 다 심볼릭 링크에 합니다.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(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을 호출하지는 않는다.

이 답변은 피톤적이지 않고 오류가 발생하기 쉬운 방법을 선호하며 정당성이 없다고 말합니다.사용자가 API를 이해하지 못하고 낮은 수준의 API를 사용하도록 유도하는 것 같습니다.

반환함으로써 True에서는 모든 예외 포함)가 허용됩니다KeyboardInterrupt ★★★★★★★★★★★★★★★★★」SystemExit 방법입니다.

이것은 사용자들이 잘못된 관행을 채택하도록 장려하는 것으로 보인다.

try 문을 선호합니다.그것은 더 나은 스타일로 간주되고 레이스 조건을 피한다.

내 약속을 꼭 믿지는 마세요.이 이론에는 많은 지지가 있다.몇 가지 예를 들어보겠습니다.

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

TL;DR
답변: 모듈 사용


Pathlib은 아마도 거의 모든 파일 작업에 가장 현대적이고 편리한 방법입니다.파일 또는 폴더가 있는 경우 코드 한 줄로 충분합니다.파일이 존재하지 않는 경우 예외는 발생하지 않습니다.

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

BTW, 패스를 재사용하는 경우에는 변수에 할당하는 것이 좋습니다.

그렇게 될 것이다

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.

은 2016년을 이용하는 이다.os.path.isfile:

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

Python 에서는 "Python 3"을 사용할 수 .pathlib:

import pathlib
path = pathlib.Path('/path/to/some/file.txt')
if path.is_file():
    ...

와 시도/제외는 것 .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'

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

다음과 같이 시도해 볼 수 있습니다(더 안전합니다.

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] 파일 또는 디렉토리가 없습니다.whattery.txt')

그 후 결과에 따라 프로그램을 계속 실행하거나 코드화하여 정지시킬 수 있습니다.

일정 : 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']}

★★★★★★★★★★★★★★의 사용을 추천합니다만,try ★★★★★★★★★★★★★★★★★」except몇 으로 가장 에 드는 것은 '어느 쪽인가'를 사용하는 입니다).os.access

  1. 파일 열기:

    파일을 열면 항상 파일의 존재가 확인됩니다.다음과 같은 기능을 만들 수 있습니다.

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

    False(거짓) Python(파이썬) IOError(IOError) OSError(OSError).시험 삼아 해보다항상 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.try(생각하게 해 준 산트 덕분에) 이런 말을 빼고는:

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

    그러면 파일에 액세스할 수 있는지 여부가 검사됩니다.권한이 있는지 확인합니다.py의 메뉴얼에 해, os.py 에 합니다.os.F_OK, 패스의 존재를 확인합니다.그러나 권한을 확인하고 파일을 여는 동안 다른 사람이 파일을 공격할 수 있기 때문에 이 방법을 사용하면 보안에 구멍이 생깁니다.그 대신에, 파일의 권한을 확인하는 대신에, 파일을 여는 것으로 직접 이동할 필요가 있습니다.(EAFP vs LBYP).나중에 파일을 열지 않고 존재 여부만 확인할 경우 이 파일을 사용할 수 있습니다.

    어쨌든, 여기:

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

또한 파일의 존재를 확인할 수 없는 두 가지 방법이 있습니다. 이든 문제가 .permission denied ★★★★★★★★★★★★★★★★★」no such file or directoryIOError을합니다.IOError as e 번째 옵션과 로) 을 하고 (를) 합니다.print(e.args)문제를 판단할 수 있도록 하기 위해서입니다.되었으면 :) ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

파일을 여는 경우는, 다음의 몇개의 방법을 사용할 수 있습니다.

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

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

되다R_OK,W_OK , , , , 입니다.X_OK권한을 테스트할 플래그(doc).

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

다른 으로 NumPy를 NumPy를 Import하다Import하다Import하다 의 다른 라이브러리를 .pathlib,os,paths 등등.

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

이것은 그 존재에 따라 true 또는 false를 반환합니다.

Brian이은 Brian이 쓸 수 .try:.

from contextlib import suppress

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

suppressPython 3.4 。이전 릴리스에서는 다음과 같이 자신만의 억제를 빠르게 작성할 수 있습니다.

from contextlib import contextmanager

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

파일 또는 디렉터리가 있는지 확인합니다.

다음의 3가지 방법을 실행할 수 있습니다.

1: § 1:os.path.isfile 으로 사용

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

2: 의 22: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의 pip과 ) method(Python 3+의 Python 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):

저는 10년 정도 된 패키지의 저자이며, 이 질문에 직접 대응하는 기능이 있습니다. 이외의 경우 를 사용합니다.Popenfind 를 하고 있는 는, 「이다」, 「윈도우즈」, 「윈도우즈」가 find효율적인 파일 시스템 워커가 필요합니다.

는 「」를 .try하여 '유닉스''로하는 경우를 합니다.find(Hand-built)find, 「 」는, 「 」로 tryOS 판별이 빨랐기 때문에 (다른 곳에서는) 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

다음은 Linux 명령줄 환경을 위한 1줄 Python 명령입니다.내가 그렇게 섹시한 배쉬남이 아니기 때문에 나는 이것이 매우 편리하다고 생각한다.

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 ★★★★★★★★★★★★★★★★★」stat.S_ISREG(mode) this this. 것이이이이 this이.os.stat는 파일, 디렉토리, 소켓, 버퍼 등에 대한 자세한 정보를 제공하는 하위 수준의 메서드입니다.os.stat에 대한 자세한 내용은 이쪽

주의: 그러나 이 방법으로는 파일이 잠기지 않기 때문에 코드가 "time of check to time of use"(TOCTTOU) 버그에 취약해질 수 있습니다.

따라서 예외를 제기하는 것은 프로그램에서 흐름 제어를 위한 허용 가능한 접근법으로 간주됩니다. IOError가 사용하여 하는 것을 해야 합니다.if(단순한 조언)

언급URL : https://stackoverflow.com/questions/82831/how-do-i-check-whether-a-file-exists-without-exceptions

반응형