web-dev-qa-db-ja.com

Python 3からFileNotFoundErrorをインポートするにはどうすればよいですか?

Python 3組み込み例外を必要とするプロジェクトでPython 2を現在使用しています:FileNotFoundError。どうすればよいですか?

18
PSNR

もちろん、必要な例外を定義できます。

しかし、彼らはあなたに何の役にも立たないでしょう。 FileNotFoundErrorの要点は、ファイルが見つからないというエラーが発生したPython操作はその例外を発生させることです。独自の例外を定義するだけでは、それは真になりません。取得するのは、適切なOSError値を持つIOError(または2.xバージョンによってはerrno)です。カスタムを処理しようとすると、 FileNotFoundError、ハンドラーが呼び出されることはありません。

だから、あなたが本当に欲しいのは(例えば)です:

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

代わりに IOError を使用できます:

I/O操作(printステートメント、組み込みのopen()関数、ファイルオブジェクトのメソッドなど)がI/O関連の理由で失敗したときに発生しますeg 、「ファイルが見つかりません」または「ディスクがいっぱいです」。

このクラスはEnvironmentErrorから派生しています。例外インスタンス属性の詳細については、上記の説明を参照してください。

バージョン2.6で変更:これを基本クラスとして使用するようにsocket.errorを変更しました。

5
Martin Thoma

FileNotFoundError例外を自分で作成するだけです。

class FileNotFoundError(OSError):
    pass

この新しい例外クラスは、Python 3.xの場合と同様に、OSErrorから継承されます。

Pythonの ser-defined Exceptions のリファレンスです。

2
user2555451

短い答え:EnvironmentErrorを使用し、err.errno == errno.ENOENTでPython 2またはPython 3.)のいずれかを確認してください

長い答え:

他の回答が述べたように、FileNotFoundErrorはPython 3。

Python 2はOSError(または2.xバージョンに応じてIOError)を使用しました。 OSErrorIOErrorはどちらもEnvironmentErrorを継承しています。

Python 3では、EnvironmentErrorOSErrorからエイリアスされます。FileNotFoundErrorOSErrorから継承されます。つまり、FileNotFoundErrorEnvironmentErrorでキャッチされ、OSErrorおよびIOErrorと同じインターフェイスを共有します。

いいニュースです!これは、プロジェクトを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
0
cowlinator