프로그래밍 언어/Python

중첩 된 디렉토리를 안전하게 만드는 방법

Rateye 2021. 6. 29. 10:08
728x90
반응형

 

질문 : 중첩 된 디렉토리를 어떻게 안전하게 만들 수 있습니까?

파일이 작성 될 디렉토리가 존재하는지 확인하고 그렇지 않은 경우 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.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 가있을 수 있지만 다른 사람이 첫 번째 확인 후 디렉터리를 만든 다음 두 번째 확인 전에 제거했다고 가정합니다. 우리는 여전히 속을 수 있습니다.

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

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
728x90
반응형