질문 : 중첩 된 디렉토리를 어떻게 안전하게 만들 수 있습니까?
파일이 작성 될 디렉토리가 존재하는지 확인하고 그렇지 않은 경우 Python을 사용하여 디렉토리를 만드는 가장 우아한 방법은 무엇입니까? 내가 시도한 것은 다음과 같습니다.
import os
file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)
try:
os.stat(directory)
except:
os.mkdir(directory)
f = file(filename)
어떻게 든 os.path.exists
놓쳤습니다 (kanja, Blair 및 Douglas에게 감사드립니다). 이것이 내가 가진 것입니다.
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
자동으로 발생하는 "open"플래그가 있습니까?
답변
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
를 트랩하고 포함 된 오류 코드를 검사하는 것입니다 (Python의 OSError에서 정보를 가져 오는 크로스 플랫폼 방법이 있습니까 참조).
import os, errno
try:
os.makedirs(directory)
except OSError as e:
if e.errno != errno.EEXIST:
raise
또는 두 번째 os.path.exists
가있을 수 있지만 다른 사람이 첫 번째 확인 후 디렉터리를 만든 다음 두 번째 확인 전에 제거했다고 가정합니다. 우리는 여전히 속을 수 있습니다.
응용 프로그램에 따라 동시 작업의 위험은 파일 권한과 같은 다른 요인으로 인한 위험보다 많거나 적을 수 있습니다. 개발자는 구현을 선택하기 전에 개발중인 특정 애플리케이션과 예상 환경에 대해 더 많이 알아야합니다.
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) # succeeds even if directory exists.
출처 : https://stackoverflow.com/questions/273192/how-can-i-safely-create-a-nested-directory
'프로그래밍 언어 > Python' 카테고리의 다른 글
arr .__ len __ ()은 파이썬에서 배열의 길이를 얻는 데 선호되는 방법 (0) | 2021.07.01 |
---|---|
파이썬에서 객체의 크기를 확인하는 방법 (0) | 2021.06.30 |
Python의 경로에서 확장자없이 파일 이름을 얻는 방법 (0) | 2021.06.29 |
Python에서 "with open"을 사용하여 여러 파일을 여는 방법 (0) | 2021.06.28 |
파이썬에서 @property 데코레이터의 작동원리 (0) | 2021.06.26 |