web-dev-qa-db-ja.com

Pythonのio.open()とos.open()の違いは何ですか?

私が使用していたopen()関数はio.open()のエイリアスであり、インポート* from osはそれを覆い隠します。

ioモジュールとosモジュールを介してファイルを開くことの違いは何ですか?

35
Gio Borje

io.open()は、ファイルI/Oへの推奨される高レベルのインターフェイスです。これは、OSレベルのファイル記述子をオブジェクトにラップして、Pythonの方法でファイルにアクセスできるようにします。

os.open()は、下位レベルのPOSIX syscallの単なるラッパーです。シンボリック(およびPOSIX-y)の引数が少なく、開いているファイルを表すファイル記述子(数値)を返します。ファイルオブジェクトを返すしない。戻り値には、read()またはwrite()メソッドはありません。

os.open()ドキュメント から:

この関数は、低レベルI/Oを対象としています。通常の使用法では、組み込み関数open()を使用します。これは、read()およびwrite()メソッド(およびその他多数)で「ファイルオブジェクト」を返します。

29
cdhowie

絶対にすべて:

  • os.open()filenameを文字列として受け取り、file属性のビット単位のマスクとしてのmode、およびファイル許可ビットを記述してファイルを返すオプションの引数整数としての記述子。

  • io.open()filenameを文字列またはファイルとして受け取ります整数としての記述子、文字列としてのファイルモード、およびオプションファイルのエンコーディング、使用されているバッファリング、エンコーディングエラーと改行の処理方法、およびファイルが閉じられたときに基礎となるFDが閉じられ、io.IOBaseの子孫を返すかどうかを示す引数

_os.open_は open() from C from Unix によく似ています。もっと低レベルのことをしているのでなければ、それを使いたくないでしょう。実際のファイル記述子(オブジェクトではなく数値など)を提供します。

_io.open_は、基本的なPython open()であり、常に使用したいものです。

4
Owen

既存の回答に追加するには:

私が使用していたopen()関数はio.open()のエイリアスであることに気付きました

open() == io.open() in Python 3のみ。Python 2では、これらは異なります。

Pythonのopen()を使用すると、便利なread()およびwrite()メソッドを使用して、使いやすいファイルオブジェクトを取得できます。 OSレベルでは、ファイルはファイル記述子(またはWindowsのファイルハンドル)を使用してアクセスされます。したがって、os.open()は暗黙的に内部で使用する必要があります。Pythonこれに関してはソースコードですが、open()にPython 3.3で追加されたopenerパラメータのドキュメントには、

Callerをopenerとして渡すことで、カスタムオープナーを使用できます。その後、openerを(fileflags)。 openerは、オープンファイル記述子を返す必要があります(_os.open_をopenerは、None)を渡すのと同様の機能になります。

したがって、os.open()open()のデフォルトのオープナーであり、ファイルフラグまたはモードを変更する必要がある場合は、その周りにカスタムラッパーを指定することもできます。特定のディレクトリに関連するファイルを開くカスタムオープナーの例については、open()documentation を参照してください。

2
wombatonfire

データベースとシステムアプリケーションの開発者は、通常、openではなくfopenを使用します。前者は、いつ、何を、どのようにメモリコンテンツをバッキングストア(つまり、ディスク上のファイル)に書き込むかを細かく制御できるためです。 。

Unixライクなオペレーティングシステムでは、openを使用して通常のファイル、ソケットエンドポイント、デバイス、パイプなどを開きます。open関数呼び出しが成功するたびに、正のファイル記述子番号が返されます。これらのオブジェクトのさまざまなイベント通知などをチェックするための一貫したAPIとフレームワークを提供します。

ただし、fopenは標準のC関数であり、通常は通常のファイルを開いてFILEデータ構造を返すために使用されます。 fopenは実際にはopenを呼び出します。 fopenは、メモリコンテンツをディスクにフラッシュまたは同期するタイミングを心配する必要がなく、イベント通知も必要ないため、通常の使用には十分です。

1
yoonghm

os.open()メソッドは、ファイルfileを開き、フラグに応じてさまざまなフラグを設定し、モードに応じてそのモードを設定します。

デフォルトのモードは0777(8進数)で、現在のマスク解除値が最初にマスクされます。

このメソッドは、新しく開かれたファイルのファイル記述子を返します。

その間、

io.open()メソッドは、文字列モードで指定されたモードでファイルを開きます。新しいファイルハンドルを返します。エラーの場合は、nilとエラーメッセージを返します。

お役に立てれば

0
AlphaMale