문제

이 질문은 이미 여기에 답이 있습니다.

비슷한 기능을 얻을 수있는 방법이 있습니까? mkdir -p 파이썬 내의 쉘에. 시스템 호출 이외의 솔루션을 찾고 있습니다. 나는 코드가 20 줄 미만이라고 확신하며 누군가가 이미 작성했는지 궁금합니다.

도움이 되었습니까?

해결책

mkdir -p 다음과 같이 기능 :

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
        else:
            raise

업데이트

Python ≥ 3.2의 경우 os.makedirs 있습니다 선택적 세 번째 인수 exist_ok 그것은 사실이면 mkdir -p 기능 -~하지 않는 한 mode 제공되고 기존 디렉토리는 의도 된 디렉토리와 다른 권한을 가지고 있습니다. 이 경우 OSError 이전과 같이 자랐습니다.

업데이트 2

Python ≥ 3.5의 경우도 있습니다 pathlib.Path.mkdir:

import pathlib

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

그만큼 exist_ok 파라미터는 Python 3.5에 추가되었습니다.

다른 팁

Python> = 3.2에서

os.makedirs(path, exist_ok=True)

이전 버전에서 사용하십시오 @tzot의 답변.

이것은 예외를 갇히는 것보다 쉽습니다.

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

부인 성명 이 접근법에는 특정 환경/조건에서 인종 조건에 더 취약한 두 가지 시스템 호출이 필요합니다. 통제 된 환경에서 실행되는 간단한 스크립트보다 더 정교한 것을 쓰고 있다면 하나의 시스템 호출 만 필요로하는 허용 된 답변을 사용하는 것이 좋습니다.

업데이트 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']

mkdir -p 파일이 이미 존재하는 경우 오류가 발생합니다.

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

따라서 이전 제안에 대한 개선은raise 예외 if 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의 답변에 대한 의견에 따르면 실제로 디렉토리를 만들기 전에 디렉토리를 만들 수 있는지 확인하는 데 문제가 있음을 알 수 있습니다. 누군가가 파일 시스템을 변경했는지 여부를 알 수 없습니다. 그것은 또한 허가가 아닌 용서를 요구하는 Python의 스타일에도 적합합니다.

따라서 우리가해야 할 첫 번째 일은 디렉토리를 만들려고 시도하는 것입니다. 그러면 잘못되면 그 이유를 해결하십시오.

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

와 함께 mkdir -p:

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

파이썬에서 유사한 행동은 예외를 제기하는 것입니다.

그래서 우리는 이것이 사실이라면 운동해야합니다. 불행히도, 우리는 할 수 없습니다. 우리는 디렉토리가 존재하는지 (양호) 존재하는지 또는 파일이 디렉토리 생성을 방지하는지 (BAD)가 존재하는지 Makedirs에서 동일한 오류 메시지를 다시 얻습니다.

일어난 일을 해결하는 유일한 방법은 파일 시스템을 다시 검사하여 디렉토리가 있는지 확인하는 것입니다. 있으면 조용히 돌아 오면 예외를 제기하십시오.

유일한 문제는 파일 시스템이 makedirs를 호출 할 때와 다른 상태에있을 수 있다는 것입니다. EG : 파일이 존재하여 MakedIrs가 실패했지만 이제는 디렉토리가 그 자리에 있습니다. 마지막 파일 시스템이 존재하는 디렉토리를 호출 할 때 함수는 예외를 제기하지 않고도 조용히 종료되기 때문에 그다지 중요하지 않습니다.

와 함께 pathlib Python3 표준 라이브러리에서 :

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

부모가 사실이라면,이 길의 실종 된 부모는 필요에 따라 만들어집니다. 모드를 고려하지 않고 기본 권한으로 생성됩니다 (POSIX MKDIR -P 명령을 모방). Evention_ok가 False (기본값) 인 경우 대상 디렉토리가 이미 존재하면 파일 체험자가 올라갑니다.

Excient_ok가 true 인 경우 FileExistSerror 예외는 무시되지만 (POSIX MKDIR -P 명령과 동일) 마지막 경로 구성 요소가 기존 비 디렉토리 파일이 아닌 경우에만 가능합니다.

버전 3.5에서 변경 : ENDERS_OK 매개 변수가 추가되었습니다.

Asa의 대답은 본질적으로 정확하다고 생각하지만 더 많이 행동하기 위해 조금 확장 할 수 있습니다. 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))

나는 개인적으로 다음과 같은 성공을 거두었지만 내 기능은 아마도 '이 디렉토리가 존재하는지 확인'과 같은 것입니다.

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
import tempfile

path = tempfile.mktemp(dir=path)
os.makedirs(path)
os.rmdir(path)
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의 답변을 기반으로하지만 나무의 일부가 이미 존재하는 곳에 버그가 고정되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top