Более элегантный способ управления перезаписью с помощью try-except-else в python? или Могу ли я сделать лучше, чем код в стиле C?

У меня есть код, который создает папку и помещает в нее выходные файлы. Я хочу использовать блок try-except-else и параметр перезаписи, для которого можно установить значение True или False, так что в случае, когда папка уже существует, а для параметра overwrite установлено значение false, она просто напечатает, что папка уже существует , а во всех остальных случаях он просто выполнится без комментариев.

Единственное решение, которое я придумал до сих пор, выглядит так:

def function( parameters, overwrite = False ):
    try:
        os.makedirs( dir )
    except OSError:
        if overwrite:
            data making code...
        else:
            print dir + ' already exists, skipping...'
    else:
        if overwrite:
            data making code...

Может быть, есть лучшее или просто более элегантное решение этой проблемы? Как, например, тот, в котором мне не нужно дублировать код создания данных? Такой способ слишком сильно напоминает мне стиль, в котором мне пришлось писать некоторые вещи на C, и не кажется очень Pythonic.


person tel    schedule 20.01.2011    source источник


Ответы (3)


(Основываясь на ответе Даниэля ДиПаоло)

import os, errno

def mkdir(path, overwrite=False):
    try:
        os.makedirs(path)
    except OSError as exc: # Python >2.5
        if exc.errno == errno.EEXIST:
            if not overwrite:
                print "path '%s' already exists" % path   # overwrite == False and we've hit a directory that exists
                return
        else: raise
    # data making code...
person Thomas K    schedule 21.01.2011

Ты уже довольно близко. Адаптация из этого ответа:

import os, errno

def mkdir(path, overwrite=False):
    try:
        os.makedirs(path)
    except OSError as exc: # Python >2.5
        if exc.errno == errno.EEXIST:
            if not overwrite:
                print "path '%s' already exists" % path   # overwrite == False and we've hit a directory that exists
        else: raise

Не понимаю, зачем вам else в блоке try.

person Daniel DiPaolo    schedule 20.01.2011
comment
Проблема в том, что помимо создания каталога мне нужен блок кода для выполнения, если 1) перезаписать = True или 2) каталог изначально не существовал. Как бы я покрыл оба случая без блока else? - person tel; 21.01.2011
comment
@tel: Проще говоря, после кода try/except. Затем поместите оператор return после печати, что он уже существует. Таким образом, если os.makedirs завершится успешно, или если overwrite имеет значение True, он в конечном итоге запишет ваш вывод. - person Thomas K; 21.01.2011
comment
Как насчет os.path.exists(path) вместо проверки errno? - person Apalala; 21.01.2011
comment
+1 как для Даниэля ДиПаоло, так и для Томаса К. else меня тоже смутил, если вы просто поместите data making после блока try, он сделает то, что вы хотите. - person Jochen Ritzel; 21.01.2011
comment
@thomas k: Хорошо, теперь я понял. Я вижу, чего мне не хватало. Если вы поместите это в ответ, я приму это. - person tel; 21.01.2011
comment
@tel: Если вы настаиваете! @Daniel: я проголосовал за ваш ответ, так как все, что я действительно сделал, это немного его изменил. - person Thomas K; 21.01.2011

if not os.path.isdir(path):
    os.makedirs(path)
elif not overwrite:
    return # something ?
pass # data making code....

Есть причины, по которым вы можете использовать makedirs для проверки существования каталога. В этом случае:

try:
    os.makedirs( dir )
except OSError:
    if not overwrite:
        print dir + ' already exists, skipping...'
        return
pass # data making code...

Вы также можете проверить, существует ли путь, но является ли он файлом, а не каталогом.

person Apalala    schedule 21.01.2011