如何从Python 3导入FileNotFoundError?
我现在在一个项目中使用Python 2,但这个项目需要用到Python 3里的一个内置异常:FileNotFoundError
。我该怎么做呢?
4 个回答
简短回答:只需使用 EnvironmentError
,并检查 err.errno == errno.ENOENT
,无论是 Python 2 还是 Python 3 都适用。
详细回答:
正如其他回答提到的,FileNotFoundError
是 Python 3 新增的。
在 Python 2 中,使用的是 OSError
(或者根据 2.x 版本可能是 IOError
)。OSError
和 IOError
都是从 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
你可以自己创建一个 FileNotFoundError
的错误。
class FileNotFoundError(OSError):
pass
这个新的错误类是从 OSError
继承而来的,就像 Python 3.x 里的那样。
这里有一个关于 用户自定义错误 的参考资料,供你了解 Python 中的相关内容。
你可以使用 IOError
来处理这个问题:
当一个输入输出操作(比如打印语句、内置的 open() 函数或者文件对象的方法)因为与输入输出相关的原因失败时,就会引发这个错误,例如:“找不到文件” 或者 “磁盘已满”。
这个错误类是从 EnvironmentError 这个类派生出来的。想了解更多关于异常实例属性的信息,可以查看上面的讨论。
在 2.6 版本中进行了更改:将 socket.error 改为使用这个作为基类。
当然,你可以定义任何你想要的异常。
但是这些自定义的异常对你并没有什么帮助。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