질문
주어진 경로에 디렉토리를 만들고 그 경로에 따라 누락된 부모 디렉토리도 만드는 방법은 무엇인가요? 예를 들어, 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.exists
및 os.makedirs
호출 사이에 만들어지면 os.makedirs
가 OSError
로 실패합니다. 불행하게도 모든 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) # 디렉토리가 이미 있어도 성공합니다.
댓글