Python-ファイルを使用する場合と開く場合


138

違いは何だfileopenPythonでは?どちらを使用すればよいですか?(私は2.5にいると言います)

回答:


153

常にを使用する必要がありますopen()

などのドキュメントの状態:

ファイルを開くときは、このコンストラクターを直接呼び出すのではなく、open()を使用することをお勧めします。fileは型テストに適しています(たとえば、 "isinstance(f、file)"と書く)。

また、Python 3.0以降でfile() は削除されています。


23
「file()コンストラクターはPython 2.2で新しく追加されました。以前のスペルのopen()は互換性のために保持されており、file()のエイリアスです。」10年前にRTFMを決定し、型とクラスの統合が非常に好きになったので、open()を再び使用することはありませんでした。さらに、タイプコンストラクターは、パスargによって配置され、モードargで要求されたとおりに動作するオブジェクトのようなファイルを返すためのより明白な方法であるとまだ感じています。私は特に、当時の開発者の明白な意図がopen4compatを2つ保持していたときに、このように感じています。
umeboshi 2013

32

2つの理由:「それを行うには1つの方法があるはずです」というpythonの哲学がfileなくなりつつあります。

file実際の型です(たとえばfile('myfile.txt')、コンストラクターを呼び出すなどを使用)。openファイルオブジェクトを返すファクトリ関数です。

Python 3.0ではfile、組み込みからioライブラリ内の複数のクラスによって実装されるようになります(バッファ付きリーダーを備えたJavaに多少似ています)。


3
何のための2つの理由?
マット

19

file()intやリストのような型です。open()ファイルを開くための関数で、fileオブジェクトを返します。

これは、openを使用する必要がある場合の例です。

f = open(filename, 'r')
for line in f:
    process(line)
f.close()

これは、ファイルを使用する必要がある場合の例です。

class LoggingFile(file):
    def write(self, data):
        sys.stderr.write("Wrote %d bytes\n" % len(data))
        super(LoggingFile, self).write(data)

ご覧のとおり、両方が存在するのには十分な理由があり、両方に明確なユースケースがあります。


5
通常、ファイルはwithステートメントで開く必要があります。with open(filename, 'r') as f: \ for line in f: \ process(line)。これにより、明示的なクローズが回避されます。Python 2.6以降では、このwithステートメントがネイティブにサポートされています。Python 2.5ではfrom __future__ import with_statement、コードの先頭に追加する必要があります。
IceArdor

2番目の例で組み込み名を再定義しただけではありませんか?
planetp 2014年

1
@ planetp、2番目の例はファイルクラスから継承します。小文字になっているのは変だと思いますが、それは基本的な組み込み型(たとえば、オブジェクト、str、リストなど)の場合と
同じ

1
Python 2.5では、fileクラスはwithステートメントによってファイルが開かれるたびに自動的に呼び出される特別なメソッドを備えていました。これらの特別な方法により、ファイルが適切かつ安全に開かれ、閉じられます。
Mausy5043

7

機能的には、この2つは同じです。とにかくopen呼び出すfileので、現在の違いはスタイルの問題です。Pythonのドキュメントが使用することをお勧めしますopen

ファイルを開くときは、ファイルコンストラクターを直接呼び出すのではなく、open()を使用することをお勧めします。

その理由は、将来のバージョンでは同じであることが保証されないためです(openファクトリ関数になり、開いているパスに応じて異なるタイプのオブジェクトを返します)。


2
openは既にファクトリ関数なので、機能の違いがあります(たとえば、継承、isinstance()など)
Brian

4

ファイルを開くためにのみopen()を使用してください。file()は実際には3.0で削除されており、現時点では非推奨です。それらはある種の奇妙な関係を持っていましたが、file()は現在進んでいるので、もう心配する必要はありません。

以下はPython 2.6ドキュメントからの抜粋です。[ブラケット関連]私が追加しました。

ファイルを開くときは、この[file()]コンストラクターを直接呼び出すのではなく、open()を使用することをお勧めします。ファイルは型のテストに適しています(たとえば、isinstance(f、file)と記述します)


2

Van Rossum氏によれば、open()は現在file()のエイリアスですが、将来変更される可能性があるため、open()を使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.