programing

Python의 mkdir -p 기능

coolbiz 2022. 10. 14. 22:09
반응형

Python의 mkdir -p 기능

하다와 비슷한 수 있는 요?mkdir -p파이썬시스템 콜 이외의 솔루션을 찾고 있습니다.코드가 20줄 미만인 것은 확실합니다만, 혹시 작성하신 분은 없습니까?

Python ≥ 3.5의 경우 다음을 사용합니다.

import pathlib
pathlib.Path("/tmp/path/to/desired/directory").mkdir(parents=True, exist_ok=True)

exist_ok파이썬 3.5를 사용하다


Python © 3.2의 경우 에는 옵션의 세 번째 인수가 있습니다.True 을 하게 합니다.mkdir -p기능성: 단, mode다른 권한을 이 「 」는 「 」를 참조해 주세요.★★★★★★★★★★★★★★★★★★·OSError.

import os
os.makedirs("/tmp/path/to/desired/directory", exist_ok=True)

버전의 에서도 Python을 사용할 수 .os.makedirs에러를 무시합니다.

import errno    
import os

def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc:  # Python ≥ 2.5
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        # possibly handle other errno cases here, otherwise finally:
        else:
            raise

Python > = 3.2에서는

os.makedirs(path, exist_ok=True)

이전 버전에서는 @tzot의 답변을 사용합니다.

이것은 예외를 트랩하는 것보다 쉽습니다.

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

면책사항 이 방법에는 특정 환경/조건에서의 레이스 조건에 더 취약한2개의 시스템 콜이 필요합니다.제어된 환경에서 실행되는 단순한 일회용 스크립트보다 더 정교한 스크립트를 작성하는 경우에는 시스템 호출을 한 번만 수행하면 되는 수용된 답변을 사용하는 것이 좋습니다.

업데이트 2012-07-27

저는 이 답변을 삭제하고 싶지만, 아래의 댓글 스레드에 가치가 있다고 생각합니다.그래서 위키로 변환하고 있습니다.

최근에 다음과 같은 distutils.dir_util.mkpath를 발견했습니다.

In [17]: from distutils.dir_util import mkpath

In [18]: mkpath('./foo/bar')
Out[18]: ['foo', 'foo/bar']

python3 표준 라이브러리의 Pathlib 사용 시:

Path(mypath).mkdir(parents=True, exist_ok=True)

부모가 true일 경우 이 경로의 누락된 부모가 필요에 따라 생성됩니다.이들은 모드를 고려하지 않고 기본 권한으로 생성됩니다(POSIX mkdir -p 명령어 모방).exist_ok가 false(기본값)인 경우 대상 디렉토리가 이미 있으면 FileExistsError가 발생합니다.

exist_ok가 true인 경우 FileExistsError 예외는 무시됩니다(POSIX mkdir -p 명령과 동일한 동작).단, 마지막 경로 컴포넌트가 기존의 디렉토리 파일이 아닌 경우에만 해당됩니다.

버전 3.5에서 변경됨: exist_ok 파라미터가 추가되었습니다.

mkdir -p파일이 이미 존재하는 경우 에러가 표시됩니다.

$ touch /tmp/foo
$ mkdir -p /tmp/foo
mkdir: cannot create directory `/tmp/foo': File exists

따라서 이전 제안의 개선점은 다음과 같습니다.raise만약의 경우 예외os.path.isdir돌아온다False(확인 시)errno.EEXIST).

(갱신) 매우 유사한 질문도 참조해 주세요.권장하는 것을 제외하고, 인정된 답변(및 경고)에 동의합니다.os.path.isdir대신os.path.exists.

(갱신) 코멘트의 제안에 따라 풀 기능은 다음과 같습니다.

import os
def mkdirp(directory):
    if not os.path.isdir(directory):
        os.makedirs(directory) 

다른 솔루션에서 설명한 바와 같이 파일 시스템을 한 번 타격할 수 있도록 하면서mkdir -p이건 불가능할 것 같은데 최대한 가까이 다가가야죠.

코드 우선, 설명 후:

import os
import errno

def mkdir_p(path):
    """ 'mkdir -p' in Python """
    try:
        os.makedirs(path)
    except OSError as exc:  # Python >2.5
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else:
            raise

@tzot의 답변에 대한 코멘트는 디렉토리를 실제로 작성하기 전에 작성할 수 있는지 확인하는 데 문제가 있음을 나타냅니다.그 사이에 누군가가 파일 시스템을 변경했는지 여부를 알 수 없습니다.그것은 또한 허락이 아닌 용서를 구하는 파이썬의 스타일과도 맞아떨어진다.

그래서 우리가 가장 먼저 해야 할 일은 디렉토리를 만드는 것입니다. 그리고 그것이 잘못되면 그 이유를 알아내는 것입니다.

Jacob Gabrielson이 지적한 바와 같이, 우리가 찾아야 할 사례 중 하나는 우리가 디렉토리를 넣으려고 하는 파일이 이미 존재하는 경우입니다.

와 함께mkdir -p:

$ touch /tmp/foo
$ mkdir -p /tmp/foo
mkdir: cannot create directory '/tmp/foo': File exists

Python에서의 유사한 동작은 예외를 발생시키는 것입니다.

그러니까 이게 사실이었는지 알아내야죠.아쉽게도, 우리는 할 수 없어요.디렉토리가 존재하는지(양호), 파일이 존재하는지 여부에 관계없이 디렉토리의 작성을 방해하는지(불량)에 대해 동일한 오류 메시지가 나타납니다.

이 문제를 해결하는 유일한 방법은 파일 시스템을 다시 검사하여 디렉터리가 있는지 확인하는 것입니다.있을 경우 자동으로 반환하고 그렇지 않을 경우 예외를 발생시킵니다.

유일한 문제는 파일시스템이 현재 makedirs가 호출되었을 때와 다른 상태일 수 있다는 것입니다.예: 파일이 존재하여 makedir가 실패했지만 디렉토리가 그 자리에 있습니다.이 함수는 마지막 파일 시스템 호출 시 디렉토리가 존재했을 때 예외를 발생시키지 않고 자동으로 종료되기 때문에 이는 그다지 중요하지 않습니다.

아사의 답변은 기본적으로 맞는 것 같습니다만, 조금 더 길게 해서mkdir -p하다

import os

def mkdir_path(path):
    if not os.access(path, os.F_OK):
        os.mkdirs(path)

또는

import os
import errno

def mkdir_path(path):
    try:
        os.mkdirs(path)
    except os.error, e:
        if e.errno != errno.EEXIST:
            raise

둘 다 경로가 이미 사일런트하게 존재하지만 다른 오류가 발생하는 경우를 처리합니다.

함수 선언

import os
def mkdir_p(filename):

    try:
        folder=os.path.dirname(filename)  
        if not os.path.exists(folder):  
            os.makedirs(folder)
        return True
    except:
        return False

사용방법:

filename = "./download/80c16ee665c8/upload/backup/mysql/2014-12-22/adclient_sql_2014-12-22-13-38.sql.gz"

if (mkdir_p(filename):
    print "Created dir :%s" % (os.path.dirname(filename))
import os
import tempfile

path = tempfile.mktemp(dir=path)
os.makedirs(path)
os.rmdir(path)

저는 개인적으로 다음과 같은 방법으로 성공을 거뒀지만, 제 기능은 '이 디렉토리가 존재하는지 확인'과 같은 것으로 불릴 것입니다.

def mkdirRecursive(dirpath):
    import os
    if os.path.isdir(dirpath): return

    h,t = os.path.split(dirpath) # head/tail
    if not os.path.isdir(h):
        mkdirRecursive(h)

    os.mkdir(join(h,t))
# end mkdirRecursive
import os
from os.path import join as join_paths

def mk_dir_recursive(dir_path):

    if os.path.isdir(dir_path):
        return
    h, t = os.path.split(dir_path)  # head/tail
    if not os.path.isdir(h):
        mk_dir_recursive(h)

    new_path = join_paths(h, t)
    if not os.path.isdir(new_path):
        os.mkdir(new_path)

@Dave C의 답변을 기반으로 하지만 트리의 일부가 이미 존재하는 버그를 수정했습니다.

언급URL : https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python

반응형