4

问题:

我有查找文件并打开它的代码。默认情况下,它会查找以#######(每个 # 为数字)开头的文件。

问题有时是文件名##-#####,有时是#####.

如果找不到文件,我想要一种方法尝试寻找可以写入文件的其他两种方法。

找不到文件时会发生 IOError 异常。我在想的是有一个 except 声明说:

except File2:
    Look for ##### in  myfindFileFunction()
    if file is still not found run except File3
except File3:
    Look for ##-#### in myfindFileFuction()
except:
    print "File not found"

我不确定如何设置自定义异常以这种方式工作,和/或是否有更 Pythonic 的方式来完全做到这一点......

设置一个模式或三个可能的文件名并迭代思想直到找到文件会更好吗?

4

3 回答 3

5

使用 try/except 确实是一种非常 Pythonic(且快速)的做事方式。

您不仅要权衡它是否是 Pythonic,还要权衡该方法在可读性方面的影响。6 个月后再看代码,你还会很快看懂代码吗?别人会吗?

我通常会确保处理这类事情的稍微复杂的 try/except 子句得到很好的注释。除此之外......这是一种完全合理的方式。

此外,为了让您在性能方面放心,这是在两种方法之间做出决定时的一个常见问题,请看这里:Python if vs try-except并且您会看到 Python 中的 try/except 结构很快......真的很快。

于 2012-07-25T16:41:40.197 回答
3

不需要自定义异常

import errno

try:
    open('somefile')
except IOError as e:
    if e.errno == errno.ENOENT:
        open('someotherfilename')
    else:
        raise e

(这是在 *nix 上-我不确定您是否使用 Windows)

于 2012-07-25T16:43:45.743 回答
1

定义自己的异常很容易——只需创建一个从 Exception 派生的类。doco 很清楚。

但是,似乎没有必要为每种文件类型创建单独的异常或任何异常。您可以执行以下操作:

文件 = ('#######', "##-#####', '#####')

fh = 无
对于文件中的 f:
    尝试:
        fh = 打开(f)
        休息
    除了 IOError 为 e:
        如果 e.errno 在 (errno.ENOENT,) 中:
            经过
        别的:
            增加

如果不是 fh:
    ## 三个尝试都失败了

使用ifarounde.errno可以让您决定哪些 IO 错误意味着继续下一个文件,哪些是您想了解的错误。文件不存在 ( errno.ENOENT) 表示尝试下一个文件。但其他类似“打开的文件太多”(errno.ENFILE)可能需要不同的响应。

于 2012-07-25T17:17:14.493 回答