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)
이것은 예외를 트랩하는 것보다 쉽습니다.
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
'programing' 카테고리의 다른 글
npm 설치 시 최대 콜스택 크기를 초과했습니다. (0) | 2022.10.14 |
---|---|
virtualenv가 글로벌 사이트 패키지에서 특정 패키지를 상속하도록 설정 (0) | 2022.10.14 |
ng-include의 올바른 구문은 무엇입니까? (0) | 2022.10.14 |
개체 배열에서 값을 검색 및 업데이트하려면 어떻게 해야 합니까? (0) | 2022.10.14 |
Nuxt.js를 사용하여 vuex 상태로 로컬 스토리지 데이터를 가져오는 방법 (0) | 2022.10.14 |