如何从Python 3导入FileNotFoundError?

21 投票
4 回答
33136 浏览
提问于 2025-05-01 16:00

我现在在一个项目中使用Python 2,但这个项目需要用到Python 3里的一个内置异常:FileNotFoundError。我该怎么做呢?

暂无标签

4 个回答

2

简短回答:只需使用 EnvironmentError,并检查 err.errno == errno.ENOENT,无论是 Python 2 还是 Python 3 都适用。

详细回答:

正如其他回答提到的,FileNotFoundError 是 Python 3 新增的。

在 Python 2 中,使用的是 OSError(或者根据 2.x 版本可能是 IOError)。OSErrorIOError 都是从 EnvironmentError 这个类派生出来的。

在 Python 3 中,EnvironmentError 被当作 OSError 来使用。FileNotFoundError 是从 OSError 派生的,这意味着你可以用 EnvironmentError 来捕获 FileNotFoundError,而且它们的接口是一样的。

所以,好消息是!这意味着有一种相对简单的方法可以让你的项目同时兼容 Python 2 和 Python 3:不使用 FileNotFoundError,只需捕获 EnvironmentError

# Works for Python 2.  Also works for Python 3.
import errno

try:
    open("fake.file", 'r')
except EnvironmentError as err:
    if err.errno == errno.ENOENT: # ENOENT -> "no entity" -> "file not found"
        print("Caught 'file not found' exception")
    else:
        raise
2

你可以自己创建一个 FileNotFoundError 的错误。

class FileNotFoundError(OSError):
    pass

这个新的错误类是从 OSError 继承而来的,就像 Python 3.x 里的那样。

这里有一个关于 用户自定义错误 的参考资料,供你了解 Python 中的相关内容。

7

你可以使用 IOError 来处理这个问题:

当一个输入输出操作(比如打印语句、内置的 open() 函数或者文件对象的方法)因为与输入输出相关的原因失败时,就会引发这个错误,例如:“找不到文件” 或者 “磁盘已满”。

这个错误类是从 EnvironmentError 这个类派生出来的。想了解更多关于异常实例属性的信息,可以查看上面的讨论。

在 2.6 版本中进行了更改:将 socket.error 改为使用这个作为基类。

32

当然,你可以定义任何你想要的异常。

但是这些自定义的异常对你并没有什么帮助。FileNotFoundError 的主要作用就是在 Python 操作遇到找不到文件的错误时,会抛出这个异常。仅仅定义你自己的异常并不能改变这一点。你最终得到的还是一个 OSError(或者在 2.x 版本中是 IOError),并且会有一个合适的 errno 值。如果你尝试处理一个自定义的 FileNotFoundError,你的处理程序根本不会被调用。

所以,你真正想要的是(例如):

try:
    f = open(path)
except OSError as e:
    if e.errno == errno.ENOENT:
        # do your FileNotFoundError code here
    else:
        raise

撰写回答