について構文は、なぜ私たちが開くようにopen("file")
を使用しますが、それを閉じていない"file".close()
のですか?
なぜそれが"file".open()
または逆にclose("file")
ですか?Pythonのオープン()対.close()
答えて
あなたより少し新しいことはありませんが、私はこれをやっていきます。基本的には、開閉はPythonのような言語ではかなり異なっています。ファイルを開くときには、ファイルを表すアプリケーション内で作業するオブジェクトを作成するので、ファイルが開かれたことをOSに知らせる関数で作成し、Pythonができるオブジェクトを作成しますファイルの読み書きに使用します。ファイルを閉じる時間が来たら、基本的に何が行われる必要があるのは、あなたのアプリケーションがOSにファイルを使って行われたことを伝え、そのファイルを表すオブジェクトをメモリから取り除くことです。これを行う最も簡単な方法は、オブジェクト自体のメソッド。また、"file".open
のような構文では、ファイルを開くためのメソッドを文字列型に含める必要があります。これは非常に奇妙なデザインであり、その構文で実装したいものに対しては文字列型に多くの拡張が必要です。 close(file)
はもっと意味をなさないでしょうが、そのオブジェクトを解放するための厄介な方法です/ OSにファイルが開かれていないことをOSに知らせ、ファイルを開いたときに作成したオブジェクトを表す変数file
を渡しますファイルのパスを指す文字列。
私はあなたの説明にいくつかの訂正をしています: 'open'関数はあなたのファイルをメモリに読み込まない。 'read'と' readlines'はそれを行います。また、開いているファイルには必ずしも「ロック」されているとは限りません。オペレーティングシステムが開いているファイル参照をどのように処理するかによって異なります。私はあなたの意図を理解していますが、私は「ロック」という言葉を使わないでください。 – skrrgwasme
ありがとうございます!私のMSのバックグラウンドはそこを通って見えていました。私はいくつかのOSがオープンファイルを処理する方法の違いを忘れていました。明確化を本当に感謝し、私は私の答えを更新しました。 –
open()
は機能であり、.close()
が対象メソッドです。 open()
関数が実際には文字列"file"
のクラスまたはインスタンスメソッドであることを意味するので、"file".open()
は意味をなさない。すべての文字列が有効なファイルまたは開かれているデバイスではないので、インタープリタが"not a file-like device".open()
をどのように処理するかはあいまいです。同じ理由で"file".close()
を使用しません。
close("file")
は、現在のプロセスが所有するファイルハンドルがそのファイルにアタッチされているかどうかを調べるためにファイル名のルックアップが必要です。それは非常に非効率的で、おそらくそれが信頼できないようにする潜在的な隠された落とし穴を持っているでしょう(例えば、ファイルではなくTTYデバイスであればどうでしょうか?)。開いているファイルやデバイスへの参照を保持し、その参照(ハンドルとも呼ばれます)を通してファイルを閉じるほうがはるかに高速で簡単です。
多くの言語では、このアプローチを取る:
f = open("file") # open a file and return a file object or handle
# stuff...
close(f) # close the file, using the file handle or object as a reference
これはあなたのclose("file")
構文に似ていますが、だまされてはいけません:に保存されているとして、それは、それへの直接参照によってファイル名をファイルしないで閉じます文字列。
Python開発者は同じことをしましたが、代わりにオブジェクト指向のアプローチで実装していたため、異なって見えます。その理由の一部は、read()
,、などのPythonファイルオブジェクトhave a lot of methodsです。close(f)
を使用した場合、残りのファイルオブジェクトメソッドのすべてを次のように変更する必要があります。正当な理由がない限り、残りの関数とは異なる振る舞いをする1つのランダムな関数にすることができます。
TL; DR
open()
とfile.close()
の設計は、OOP主体と良好なファイル参照慣行と一致しています。open()
は、ファイルやその他のデバイスを参照するオブジェクトを作成するファクトリのような関数です。オブジェクトが作成されると、そのオブジェクトに対する他のすべての操作は、クラスまたはインスタンスのメソッドによって行われます。
通常は、"file".close()
を明示的に使用しないでください。コンテキストマネージャとしてopen(file)
を使用して、例外が発生した場合にファイルハンドルも閉じます。問題の終了:
実際にあなたの質問に答えるためには、open
は多くのオプションをサポートしており、返されるクラスはこれらのオプションによって異なります(io
moduleも参照)。したがって、エンドユーザーがどのクラスを覚えているのかを正確に把握してから、適切なクラス自体に"class".open
を使用するだけでは、はるかに複雑になります。また、 "ラップするファイルの整数ファイル記述子"を渡すこともできます。 open
には、これはstr.open()
メソッドを持っている以外にも、int.open()
を取得することを意味します。これは本当に悪いのOO設計だけでなく、混乱するだろう。 StackOverflowでどのような質問が出るのかはわかりません("door".open()
、(1).open()
)...
しかし、私はpathlib.Path.open
という機能があることを認めなければなりません。しかし、あなたが道を持っているなら、もはやあいまいではありません。
close()
関数について:各インスタンスにはすでにclose()
メソッドがあり、異なるクラス間に違いはないので、なぜ追加の関数を作成するのですか?単に利点がありません。
私が言ったことに加えて、file
タイプのビルドを削除したPythonの変更ログを引用します。 (Pythonの2で利用可能)file
タイプを使用して、クラスのコンストラクタのアプローチはPython 3で削除された理由は(簡単に)説明:
は、ファイルの種類を削除しました。 open()を使用します。 ioモジュールでオープンできるストリームには、いくつかの種類があります。
file("filename")
がfile
のインスタンスを作成しながら、基本的には、open("filename")
は、モードに応じて、異なるストリームクラスのインスタンスを返すことができます。
- 1. Pythonオープンの生のオーディオデータファイル
- 2. python closeファイル記述子の質問
- 3. [CLOSE]
- 4. ファイルのオープンとクローズの目的python
- 5. foreach closeのbindParam
- 6. セロリジョブ(python)のclose()またはjoin()と同等ですか?
- 7. TokyoCabinet:hdb-> close()のセグメンテーションフォールト
- 8. Java FileWriter:クライアント/サーバー環境でのファイルのオープン/クローズ(複数インスタンス)対単一のオープン/クローズ(単一インスタンス)
- 9. MVC3 Closeタグダイナミックに
- 10. DialogPreference force close
- 11. AdMob Force Close(Android)
- 12. lighttpd force close connection
- 13. close customダイアログandroid
- 14. DialogFragment Closeイベント
- 15. liveCycle force close document
- 16. C#close standard out
- 17. Close Socks Connection Ruby
- 18. SSLEngineとclose
- 19. Ajax http request close
- 20. 警告:ZipArchive Close
- 21. Doctrine 2 Close Connection
- 22. Session_set_save_handler close/gc
- 23. Vb.net process close event
- 24. Express.js close response
- 25. Jquery Close Subサブメニュー
- 26. Android:Force Close Error
- 27. .Net MemoryStream close issue
- 28. hibernate session close
- 29. Netty websocket close gracefully
- 30. UIKITライトボックスJavascript Close
スタイルのことです。オブジェクトで動作する関数は一般にそのオブジェクトのメソッドですが、最初にオブジェクトを生成する方法が必要です... –
'' file ".open()' *私にとっては間違っているようです* 'str.open()'を有効にすると '' str.open() ''のように見えますが、すべての文字列は '' split() 'などとなります。 – Aurora0001
' 'ファイル ''ではないので、 .open() 'は一致しません。私はそれが簡単に 'close(file_object)'だったと思います。 – user2357112