본문 바로가기
Python/Python FAQ

Python 부모 디렉토리가 없으면 디렉토리를 생성하는 방법은 무엇인가요?, How do I create a directory, and any missing parent directories?

by 베타코드 2023. 5. 4.
반응형

질문

주어진 경로에 디렉토리를 만들고 그 경로에 따라 누락된 부모 디렉토리도 만드는 방법은 무엇인가요? 예를 들어, Bash 명령어 mkdir -p /path/to/nested/directory가 이를 수행합니다.

답변

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.makedirsOSError로 실패합니다. 불행하게도 모든 OSError를 잡아서 계속하는 것은 무모한 것이며, 다른 요인 (권한 부족, 디스크 가득, 등)으로 인해 디렉토리를 만들지 못한 것을 무시합니다.

하나의 옵션은 OSError를 catch하여 내장된 오류 코드를 검사하는 것입니다 (참조: 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 

...그리고 3.2+에서 os.makedirs에 대한 키워드 인자인 exist_ok를 허용합니다.

os.makedirs("path/to/directory", exist_ok=True)  # 디렉토리가 이미 있어도 성공합니다. 
반응형

댓글