Функциональность mkdir -p в Python [дубликат]

Элементы с фоном Transparent получают события щелчка мыши при нажатии на фон, элементы с Null этого не делают.

714
задан Adam Matan 4 November 2015 в 16:19
поделиться

4 ответа

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.

1007
ответ дан tzot 5 November 2015 в 02:19
поделиться

Это легче, чем захват исключения:

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

Правовая оговорка Этот подход требует двух системных вызовов, который более восприимчив к условиям состязания под определенными средами/условиями. Если Вы пишете что-то более сложное, чем простой одноразовый сценарий, работающий в управляемой среде, Вы - более обеспеченное движение с принятым ответом, который требует только одного системного вызова.

ОБНОВЛЕНИЕ 27.07.2012

я испытываю желание удалить этот ответ, но я думаю, что существует значение в потоке комментария ниже. По сути, я преобразовываю его в Wiki.

155
ответ дан 5 revs, 2 users 97% 5 November 2015 в 02:19
поделиться

Я думаю, что ответ 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

они оба обрабатывают случай, где путь уже существует тихо, но позвольте другому ошибочному пузырю.

12
ответ дан davidavr 5 November 2015 в 02:19
поделиться

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) 
16
ответ дан 22 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: