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

У меня есть код, который создает папку и помещает в нее выходные файлы.Я хочу использовать блок try-исключением-else и параметр перезаписи, который может быть установлен в True или False, чтобы в случае, когда папка уже существовала, а для перезаписи было задано значение 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...

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

Ответы [ 3 ]

5 голосов
/ 21 января 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.

3 голосов
/ 21 января 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
                return
        else: raise
    # data making code...
0 голосов
/ 21 января 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...

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

...