在Python中使用try-except-else控制覆盖的更优雅方法?还是能比C风格代码更好吗?

0 投票
3 回答
2387 浏览
提问于 2025-04-16 10:20

我有一段代码,它可以创建一个文件夹并把输出文件放进去。我想使用一个包含try-except-else的结构,并且希望有一个覆盖选项,这个选项可以设置为真或假。这样的话,如果文件夹已经存在而覆盖选项设置为假,它就会打印出“文件夹已经存在”,在其他情况下,它就会正常执行,不会有任何提示。

到目前为止,我想到的唯一解决方案是这样的:

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的风格。

3 个回答

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

你可能还想检查一下这个路径是否存在,但它是一个文件而不是文件夹。

5

你已经很接近了。可以参考这个回答来进行调整:

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

我不明白为什么在try块里需要一个else

3

(基于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...

撰写回答