Skip to content

Commit

Permalink
bpo-6519: Improve Python Input Output Tutorial (GH-2143)
Browse files Browse the repository at this point in the history
Move up the discussion about 'with' keyword, so it appears earlier in the document.
  • Loading branch information
akuchling authored and Mariatta committed Jun 13, 2017
1 parent 81f67b6 commit bd4e9e0
Showing 1 changed file with 29 additions and 21 deletions.
50 changes: 29 additions & 21 deletions Doc/tutorial/inputoutput.rst
Expand Up @@ -262,6 +262,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:

Expand Down Expand Up @@ -354,27 +383,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.
Expand Down

0 comments on commit bd4e9e0

Please sign in to comment.