在python中使用try控制覆盖的更优雅的方法是什么?或者我能做得比C风格代码更好吗?

在python中使用try控制覆盖的更优雅的方法是什么?或者我能做得比C风格代码更好吗?,python,coding-style,try-catch,repeat,Python,Coding Style,Try Catch,Repeat,我有代码,可以创建一个文件夹并将输出文件放在其中。我想使用一个try-except-else块和一个overwrite选项,该选项可以设置为True或False,这样在文件夹已经存在并且overwrite设置为False的情况下,它将只打印文件夹已经存在,而在所有其他情况下,它将只执行而不添加注释 到目前为止,我提出的唯一解决方案如下: def function( parameters, overwrite = False ): try: os.makedirs( dir

我有代码,可以创建一个文件夹并将输出文件放在其中。我想使用一个try-except-else块和一个overwrite选项,该选项可以设置为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语言写一些东西的风格,而且看起来不太像Python。

你已经很接近了。改编:

我不明白你为什么要在try区再找一个

您可以使用makedirs来测试目录是否存在,这是有原因的。在这种情况下:

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

您可能还想检查路径是否存在,但它是一个文件而不是一个目录。

基于Daniel DiPaolo的答案

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...

问题是,与创建目录不同,如果1 overwrite=True或2目录最初不存在,我需要执行一段代码。在没有else块的情况下,我如何处理这两种情况?@tel:只需将其放在try/except代码之后。然后在打印后放入一个return语句,说明它已经存在。这样,如果os.makedirs成功,或者覆盖为真,它将最终写入您的输出。那么os.path.existspath如何,而不是检查错误号?+1(Daniel DiPaolo和Thomas K)。另外一个问题也让我感到困惑,如果您只是简单地将数据生成放在try块之后,它就会满足您的要求。@Thomas K:好的,我现在知道了。我知道我错过了什么。如果你在答复中这样说,我会接受的。
try:
    os.makedirs( dir )
except OSError:
    if not overwrite:
        print dir + ' already exists, skipping...'
        return
pass # data making code...
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...