파이썬에 디렉토리가 있는지 확인하는 방법


1136

os파이썬 의 모듈에서 디렉토리가 존재하는지 찾는 방법이 있습니까?

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
경고의 한마디 – 최고 등급의 답변은 경쟁 조건에 취약 할 수 있습니다. os.stat디렉토리가 둘 다 존재하며 동시에 디렉토리인지 확인 하기 위해 대신 수행 할 수 있습니다 .
d33tah

1
@ d33tah 당신은 좋은 지적을 가지고 있지만 os.stat파일에서 디렉토리를 알려주 는 방법을 보지 못했습니다 . 그것은 제기 OSError경로가 무효 인 경우에, 그것은 파일이나 디렉토리의 여부에 상관없이. 또한 검사 후의 코드는 경쟁 조건에 취약합니다.
Tomáš Zato-복원 모니카

4
@ TomášZato : 작업을 수행하고 오류를 처리하는 것이 안전하다는 결론으로 ​​이어집니다.
d33tah

2
@ David542 나는 "isdir" "exists"에 대한 정밀도를 테스트하는 설명을 추가했습니다. 나는 당신이 지금 무엇이든 배울 것이라고 생각합니다. 그러나 그것은 새로운 사람들을 밝힐 수 있습니다.
GeoStoneMarten

답변:


1728

찾고 os.path.isdir있거나 os.path.exists파일인지 디렉토리인지 상관하지 않습니다.

예:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib 괄호는 객체가 호출 가능하다는 것을 나타 내기 위해 사용될 수 있지만 클래스조차도 호출 가능하므로 파이썬에서는 유용하지 않습니다. 또한 함수는 파이썬에서 일류 값이며, 다음과 같이 괄호 표기 없이 사용할 수 있습니다 .existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
와 같은 다른 함수에 함수를 전달할 수 map있지만 일반적으로 인수와 괄호로 함수를 호출합니다. 또한 귀하의 예에는 오타가 있습니다. 아마 당신은 의미 filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])합니다.
hughdbrown

4
또한 os.path.isfile(path)파일인지 여부 만 신경 쓰면됩니다.
Nicholas

2
일부 플랫폼에서는 파일 / 디렉토리가 존재하면 false를 반환하지만 읽기 권한 오류도 발생합니다.
cowlinator 2018

74

너무 가까이! 현재 존재하는 디렉토리의 이름을 전달하면를 os.path.isdir반환 True합니다. 존재하지 않거나 디렉토리가 아닌 경우를 반환합니다 False.


70

Python 3.4는 파일 라이브러리 경로를 처리하기위한 객체 지향 접근 방식을 제공하는 표준 라이브러리에 모듈 을 도입 했습니다pathlib . 객체 의 is_dir()exists()메소드를 Path사용하여 질문에 대답 할 수 있습니다.

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

경로 (및 문자열)는 /연산자 와 함께 결합 될 수 있습니다 .

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib는 PyPi 의 pathlib2 모듈을 통해 Python 2.7에서도 사용할 수 있습니다 .


약간의 설명이 도움이 될 것입니다. 왜 "뭐하는거야 p / 'bin' / 'vim'?
나단

1
@ frank 나는 대답의 두 번째 부분에 대해 조금 자세히 설명했습니다.
joelostblom

34

그렇습니다 os.path.exists().


23
경로가 디렉토리인지 확인하지 않습니다.
Kirk Strauser 2012 년

7
잘 했어 다른 사람들 os.path.isdir은 그것을 달성 할 것이라고 지적했습니다 .
aganders3

3
이것이 질문에 대한 답변이 아니라는 것을 이해한다면, 답변을 제거하지 않겠습니까?

3
@CamilStaps이 질문은 354000 번 읽혔습니다 (지금까지). 여기에 대한 답변은 OP뿐만 아니라 어떤 이유로 든 여기에 올 수있는 사람을위한 것입니다. aganders3의 답변은 OP의 문제를 직접 해결하지 않아도 관련이 있습니다.
Gabriel

4
@ 가브리엘 (Gabriel)은 이것이 실제로 무엇을하는지 대답에서 분명히해야합니다.

21

내장 기능 2 개로 확인할 수 있습니다

os.path.isdir("directory")

지정된 디렉토리가 사용 가능하면 부울 true를 제공합니다.

os.path.exists("directoryorfile")

지정된 디렉토리 또는 파일이 사용 가능한 경우 boolead에 true를 제공합니다.

경로가 디렉토리인지 확인합니다.

os.path.isdir("directorypath")

경로가 디렉토리이면 부울 true를 제공합니다.


2
이것은 오래된 최고 답변과 완전히 중복됩니다.
Davis Herring 1


10

에서처럼 :

In [3]: os.path.exists('/d/temp')
Out[3]: True

아마 os.path.isdir(...)확실하게 던져 .


10

os.stat버전 을 제공하기 위해 (파이썬 2) :

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

os는 다음과 같은 많은 기능을 제공합니다.

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

입력 경로가 유효하지 않으면 listdir에서 예외가 발생합니다.


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
python에는 디렉토리를 생성하는 함수가 내장되어 있기 때문에 os.makedirs('mydir')대신 사용 하는 편이 좋습니다os.system(...)
gizzmole

9
'새 디렉토리가 작성되었습니다'라는 인쇄를하고 있지만 그 사실을 모릅니다. 디렉토리를 생성 할 권한이 없으면 어떻게합니까? '새 디렉토리가 작성되었습니다'를 인쇄 하지만 사실이 아닙니다. 그럴까요
Wojciech Jakubas

4

편리한 Unipath모듈이 있습니다.

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

필요한 기타 관련 사항 :

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

pip를 사용하여 설치할 수 있습니다.

$ pip3 install unipath

내장과 비슷합니다 pathlib. 차이점은 모든 경로를 문자열로 취급한다는 것 Path입니다.str ). 일부 함수가 문자열을 기대하면 쉽게 전달할 수 있습니다.Path 로 변환하지 않고도 객체에 .

예를 들어, 이것은 장고와 함께 잘 작동합니다 settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

디렉토리가 없으면 디렉토리를 작성할 수도 있습니다.

출처아직 SO에 있다면 .

===================================================== ====================

Python ≥ 3.5에서는 다음을 사용하십시오 pathlib.Path.mkdir.

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

이전 버전의 Python의 경우 작은 결함이있는 좋은 품질의 두 가지 답변을 보았습니다.

시도 하고 창조를 os.path.exists고려 하십시오 os.makedirs.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

의견과 다른 곳에서 언급했듯이 경쟁 조건이 있습니다. 디렉토리가 os.path.existsos.makedirs호출 사이에 생성 os.makedirs되면는로 실패합니다 OSError. 불행히도, OSError불완전한 권한, 전체 디스크 등과 같은 다른 요인으로 인해 디렉토리를 만들지 못하는 것을 무시할 수 있기 때문에 담요 잡기 및 계속은 절대 쉽지 않습니다.

하나의 옵션은 OSError포함 된 오류 코드 를 포착 하고 검사하는 것입니다 (Python의 OSError에서 정보를 가져 오는 플랫폼 간 방법이 있습니까)를 참조하십시오 .

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

또는 두 번째가있을 수 있습니다 os.path.exists 있지만 다른 첫 번째 검사 후에 디렉토리를 만든 다음 두 번째 검사 전에 디렉토리를 제거했다고 가정합니다. 여전히 속일 수 있습니다.

응용 프로그램에 따라 동시 작업의 위험은 파일 권한과 같은 다른 요인으로 인한 위험보다 많거나 적을 수 있습니다. 개발자는 구현을 선택하기 전에 개발중인 특정 응용 프로그램과 예상 환경에 대해 더 많이 알아야합니다.

최신 버전의 Python FileExistsError은 (3.3 이상에서) 노출 함으로써이 코드를 상당히 개선합니다 ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... 그리고 키워드 인수가 os.makedirs호출exist_ok 되도록 허용 합니다 (3.2 이상).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

두가지

  1. 디렉토리가 존재하는지 확인 하시겠습니까?
  2. 그렇지 않은 경우 디렉토리를 작성하십시오 (선택 사항).
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.