diff options
author | Mariatta <Mariatta@users.noreply.github.com> | 2017-06-13 05:40:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-13 05:40:43 (GMT) |
commit | 5a86154a931083e6a9f9bdf9cc8b3bc33abb673d (patch) | |
tree | 91553e0b9c486aed4a76704dc593d112b7411ed7 | |
parent | 37e04153d5e331162608b33639ecd3c9a5ae2432 (diff) | |
download | cpython-5a86154a931083e6a9f9bdf9cc8b3bc33abb673d.zip cpython-5a86154a931083e6a9f9bdf9cc8b3bc33abb673d.tar.gz cpython-5a86154a931083e6a9f9bdf9cc8b3bc33abb673d.tar.bz2 |
bpo-6519: Improve Python Input Output Tutorial (GH-2143) (GH-2146)
Move up the discussion about 'with' keyword, so it appears earlier in the document.
(cherry picked from commit bd4e9e0ca96dabf33605d9b1fd1e0562ece8ae18)
-rw-r--r-- | Doc/tutorial/inputoutput.rst | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index 999034a..32cb578 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -261,6 +261,35 @@ to file data is fine for text files, but will corrupt binary data like that in :file:`JPEG` or :file:`EXE` files. Be very careful to use binary mode when reading and writing such files. +It is good practice to use the :keyword:`with` keyword when dealing +with file objects. The advantage is that the file is properly closed +after its suite finishes, even if an exception is raised at some +point. Using :keyword:`with` is also much shorter than writing +equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: + + >>> with open('workfile') as f: + ... read_data = f.read() + >>> f.closed + True + +If you're not using the :keyword:`with` keyword, then you should call +``f.close()`` to close the file and immediately free up any system +resources used by it. If you don't explicitly close a file, Python's +garbage collector will eventually destroy the object and close the +open file for you, but the file may stay open for a while. Another +risk is that different Python implementations will do this clean-up at +different times. + +After a file object is closed, either by a :keyword:`with` statement +or by calling ``f.close()``, attempts to use the file object will +automatically fail. :: + + >>> f.close() + >>> f.read() + Traceback (most recent call last): + File "<stdin>", line 1, in <module> + ValueError: I/O operation on closed file + .. _tut-filemethods: @@ -353,27 +382,6 @@ to the very file end with ``seek(0, 2)``) and the only valid *offset* values are those returned from the ``f.tell()``, or zero. Any other *offset* value produces undefined behaviour. - -When you're done with a file, call ``f.close()`` to close it and free up any -system resources taken up by the open file. After calling ``f.close()``, -attempts to use the file object will automatically fail. :: - - >>> f.close() - >>> f.read() - Traceback (most recent call last): - File "<stdin>", line 1, in <module> - ValueError: I/O operation on closed file - -It is good practice to use the :keyword:`with` keyword when dealing with file -objects. This has the advantage that the file is properly closed after its -suite finishes, even if an exception is raised on the way. It is also much -shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: - - >>> with open('workfile', 'r') as f: - ... read_data = f.read() - >>> f.closed - True - File objects have some additional methods, such as :meth:`~file.isatty` and :meth:`~file.truncate` which are less frequently used; consult the Library Reference for a complete guide to file objects. |