:mod:`!io` --- Core tools for working with streams
==================================================

.. module:: io
   :synopsis: Core tools for working with streams.

**Source code:** :source:`Lib/io.py`

--------------

.. _io-overview:

Overview
--------

.. index::
   single: file object; io module

The :mod:`!io` module provides Python's main facilities for dealing with various
types of I/O.  There are three main types of I/O: *text I/O*, *binary I/O*
and *raw I/O*.  These are generic categories, and various backing stores can
be used for each of them.  A concrete object belonging to any of these
categories is called a :term:`file object`.  Other common terms are *stream*
and *file-like object*.

Independent of its category, each concrete stream object will also have
various capabilities: it can be read-only, write-only, or read-write. It can
also allow arbitrary random access (seeking forwards or backwards to any
location), or only sequential access (for example in the case of a socket or
pipe).

All streams are careful about the type of data you give to them.  For example
giving a :class:`str` object to the :meth:`!write` method of a binary stream
will raise a :exc:`TypeError`.  So will giving a :class:`bytes` object to the
:meth:`!write` method of a text stream.

.. versionchanged:: 3.3
   Operations that used to raise :exc:`IOError` now raise :exc:`OSError`, since
   :exc:`IOError` is now an alias of :exc:`OSError`.


Text I/O
^^^^^^^^

Text I/O expects and produces :class:`str` objects.  This means that whenever
the backing store is natively made of bytes (such as in the case of a file),
encoding and decoding of data is made transparently as well as optional
translation of platform-specific newline characters.

The easiest way to create a text stream is with :meth:`open`, optionally
specifying an encoding::

   f = open("myfile.txt", "r", encoding="utf-8")

In-memory text streams are also available as :class:`StringIO` objects::

   f = io.StringIO("some initial text data")

.. note::

   When working with a non-blocking stream, be aware that read operations on text I/O objects
   might raise a :exc:`BlockingIOError` if the stream cannot perform the operation
   immediately.

The text stream API is described in detail in the documentation of
:class:`TextIOBase`.


Binary I/O
^^^^^^^^^^

Binary I/O (also called *buffered I/O*) expects
:term:`bytes-like objects <bytes-like object>` and produces :class:`bytes`
objects.  No encoding, decoding, or newline translation is performed.  This
category of streams can be used for all kinds of non-text data, and also when
manual control over the handling of text data is desired.

The easiest way to create a binary stream is with :meth:`open` with ``'b'`` in
the mode string::

   f = open("myfile.jpg", "rb")

In-memory binary streams are also available as :class:`BytesIO` objects::

   f = io.BytesIO(b"some initial binary data: \x00\x01")

The binary stream API is described in detail in the docs of
:class:`BufferedIOBase`.

Other library modules may provide additional ways to create text or binary
streams.  See :meth:`socket.socket.makefile` for example.


Raw I/O
^^^^^^^

Raw I/O (also called *unbuffered I/O*) is generally used as a low-level
building-block for binary and text streams; it is rarely useful to directly
manipulate a raw stream from user code.  Nevertheless, you can create a raw
stream by opening a file in binary mode with buffering disabled::

   f = open("myfile.jpg", "rb", buffering=0)

The raw stream API is described in detail in the docs of :class:`RawIOBase`.


.. _io-text-encoding:

Text Encoding
-------------

The default encoding of :class:`TextIOWrapper` and :func:`open` is
locale-specific (:func:`locale.getencoding`).

However, many developers forget to specify the encoding when opening text files
encoded in UTF-8 (e.g. JSON, TOML, Markdown, etc...) since most Unix
platforms use UTF-8 locale by default. This causes bugs because the locale
encoding is not UTF-8 for most Windows users. For example::

   # May not work on Windows when non-ASCII characters in the file.
   with open("README.md") as f:
       long_description = f.read()

Accordingly, it is highly recommended that you specify the encoding
explicitly when opening text files. If you want to use UTF-8, pass
``encoding="utf-8"``. To use the current locale encoding,
``encoding="locale"`` is supported since Python 3.10.

.. seealso::

   :ref:`utf8-mode`
      Python UTF-8 Mode can be used to change the default encoding to
      UTF-8 from locale-specific encoding.

   :pep:`686`
      Python 3.15 will make :ref:`utf8-mode` default.

.. _io-encoding-warning:

Opt-in EncodingWarning
^^^^^^^^^^^^^^^^^^^^^^

.. versionadded:: 3.10
   See :pep:`597` for more details.

To find where the default locale encoding is used, you can enable
the :option:`-X warn_default_encoding <-X>` command line option or set the
:envvar:`PYTHONWARNDEFAULTENCODING` environment variable, which will
emit an :exc:`EncodingWarning` when the default encoding is used.

If you are providing an API that uses :func:`open` or
:class:`TextIOWrapper` and passes ``encoding=None`` as a parameter, you
can use :func:`text_encoding` so that callers of the API will emit an
:exc:`EncodingWarning` if they don't pass an ``encoding``. However,
please consider using UTF-8 by default (i.e. ``encoding="utf-8"``) for
new APIs.


High-level Module Interface
---------------------------

.. data:: DEFAULT_BUFFER_SIZE

   An int containing the default buffer size used by the module's buffered I/O
   classes.  :func:`open` uses the file's blksize (as obtained by
   :func:`os.stat`) if possible.


.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

   This is an alias for the builtin :func:`open` function.

   .. audit-event:: open path,mode,flags io.open

      This function raises an :ref:`auditing event <auditing>` ``open`` with
      arguments *path*, *mode* and *flags*. The *mode* and *flags*
      arguments may have been modified or inferred from the original call.


.. function:: open_code(path)

   Opens the provided file with mode ``'rb'``. This function should be used
   when the intent is to treat the contents as executable code.

   *path* should be a :class:`str` and an absolute path.

   The behavior of this function may be overridden by an earlier call to the
   :c:func:`PyFile_SetOpenCodeHook`. However, assuming that *path* is a
   :class:`str` and an absolute path, ``open_code(path)`` should always behave
   the same as ``open(path, 'rb')``. Overriding the behavior is intended for
   additional validation or preprocessing of the file.

   .. versionadded:: 3.8


.. function:: text_encoding(encoding, stacklevel=2, /)

   This is a helper function for callables that use :func:`open` or
   :class:`TextIOWrapper` and have an ``encoding=None`` parameter.

   This function returns *encoding* if it is not ``None``.
   Otherwise, it returns ``"locale"`` or ``"utf-8"`` depending on
   :ref:`UTF-8 Mode <utf8-mode>`.

   This function emits an :class:`EncodingWarning` if
   :data:`sys.flags.warn_default_encoding <sys.flags>` is true and *encoding*
   is ``None``. *stacklevel* specifies where the warning is emitted.
   For example::

      def read_text(path, encoding=None):
          encoding = io.text_encoding(encoding)  # stacklevel=2
          with open(path, encoding) as f:
              return f.read()

   In this example, an :class:`EncodingWarning` is emitted for the caller of
   ``read_text()``.

   See :ref:`io-text-encoding` for more information.

   .. versionadded:: 3.10

   .. versionchanged:: 3.11
      :func:`text_encoding` returns "utf-8" when UTF-8 mode is enabled and
      *encoding* is ``None``.


.. exception:: BlockingIOError

   This is a compatibility alias for the builtin :exc:`BlockingIOError`
   exception.


.. exception:: UnsupportedOperation

   An exception inheriting :exc:`OSError` and :exc:`ValueError` that is raised
   when an unsupported operation is called on a stream.


.. seealso::

   :mod:`sys`
       contains the standard IO streams: :data:`sys.stdin`, :data:`sys.stdout`,
       and :data:`sys.stderr`.


Class hierarchy
---------------

The implementation of I/O streams is organized as a hierarchy of classes.  First
:term:`abstract base classes <abstract base class>` (ABCs), which are used to
specify the various categories of streams, then concrete classes providing the
standard stream implementations.

.. note::

   The abstract base classes also provide default implementations of some
   methods in order to help implementation of concrete stream classes.  For
   example, :class:`BufferedIOBase` provides unoptimized implementations of
   :meth:`!readinto` and :meth:`!readline`.

At the top of the I/O hierarchy is the abstract base class :class:`IOBase`.  It
defines the basic interface to a stream.  Note, however, that there is no
separation between reading and writing to streams; implementations are allowed
to raise :exc:`UnsupportedOperation` if they do not support a given operation.

The :class:`RawIOBase` ABC extends :class:`IOBase`.  It deals with the reading
and writing of bytes to a stream.  :class:`FileIO` subclasses :class:`RawIOBase`
to provide an interface to files in the machine's file system.

The :class:`BufferedIOBase` ABC extends :class:`IOBase`.  It deals with
buffering on a raw binary stream (:class:`RawIOBase`).  Its subclasses,
:class:`BufferedWriter`, :class:`BufferedReader`, and :class:`BufferedRWPair`
buffer raw binary streams that are writable, readable, and both readable and writable,
respectively. :class:`BufferedRandom` provides a buffered interface to seekable streams.
Another :class:`BufferedIOBase` subclass, :class:`BytesIO`, is a stream of
in-memory bytes.

The :class:`TextIOBase` ABC extends :class:`IOBase`.  It deals with
streams whose bytes represent text, and handles encoding and decoding to and
from strings.  :class:`TextIOWrapper`, which extends :class:`TextIOBase`, is a buffered text
interface to a buffered raw stream (:class:`BufferedIOBase`).  Finally,
:class:`StringIO` is an in-memory stream for text.

Argument names are not part of the specification, and only the arguments of
:func:`open` are intended to be used as keyword arguments.

The following table summarizes the ABCs provided by the :mod:`!io` module:

.. tabularcolumns:: |l|l|L|L|

=========================  ==================  ========================  ==================================================
ABC                        Inherits            Stub Methods              Mixin Methods and Properties
=========================  ==================  ========================  ==================================================
:class:`IOBase`                                ``fileno``, ``seek``,     ``close``, ``closed``, ``__enter__``,
                                               and ``truncate``          ``__exit__``, ``flush``, ``isatty``, ``__iter__``,
                                                                         ``__next__``, ``readable``, ``readline``,
                                                                         ``readlines``, ``seekable``, ``tell``,
                                                                         ``writable``, and ``writelines``
:class:`RawIOBase`         :class:`IOBase`     ``readinto`` and          Inherited :class:`IOBase` methods, ``read``,
                                               ``write``                 and ``readall``
:class:`BufferedIOBase`    :class:`IOBase`     ``detach``, ``read``,     Inherited :class:`IOBase` methods, ``readinto``,
                                               ``read1``, and ``write``  and ``readinto1``
:class:`TextIOBase`        :class:`IOBase`     ``detach``, ``read``,     Inherited :class:`IOBase` methods, ``encoding``,
                                               ``readline``, and         ``errors``, and ``newlines``
                                               ``write``
=========================  ==================  ========================  ==================================================


I/O Base Classes
^^^^^^^^^^^^^^^^

.. class:: IOBase

   The abstract base class for all I/O classes.

   This class provides empty abstract implementations for many methods
   that derived classes can override selectively; the default
   implementations represent a file that cannot be read, written or
   seeked.

   Even though :class:`IOBase` does not declare :meth:`!read`
   or :meth:`!write` because their signatures will vary, implementations and
   clients should consider those methods part of the interface.  Also,
   implementations may raise a :exc:`ValueError` (or :exc:`UnsupportedOperation`)
   when operations they do not support are called.

   The basic type used for binary data read from or written to a file is
   :class:`bytes`.  Other :term:`bytes-like objects <bytes-like object>` are
   accepted as method arguments too.  Text I/O classes work with :class:`str` data.

   Note that calling any method (even inquiries) on a closed stream is
   undefined.  Implementations may raise :exc:`ValueError` in this case.

   :class:`IOBase` (and its subclasses) supports the iterator protocol, meaning
   that an :class:`IOBase` object can be iterated over yielding the lines in a
   stream.  Lines are defined slightly differently depending on whether the
   stream is a binary stream (yielding bytes), or a text stream (yielding
   character strings).  See :meth:`~IOBase.readline` below.

   :class:`IOBase` is also a context manager and therefore supports the
   :keyword:`with` statement.  In this example, *file* is closed after the
   :keyword:`!with` statement's suite is finished---even if an exception occurs::

      with open('spam.txt', 'w') as file:
          file.write('Spam and eggs!')

   :class:`IOBase` provides these data attributes and methods:

   .. method:: close()

      Flush and close this stream. This method has no effect if the file is
      already closed. Once the file is closed, any operation on the file
      (e.g. reading or writing) will raise a :exc:`ValueError`.

      As a convenience, it is allowed to call this method more than once;
      only the first call, however, will have an effect.

   .. attribute:: closed

      ``True`` if the stream is closed.

   .. method:: fileno()

      Return the underlying file descriptor (an integer) of the stream if it
      exists.  An :exc:`OSError` is raised if the IO object does not use a file
      descriptor.

   .. method:: flush()

      Flush the write buffers of the stream if applicable.  This does nothing
      for read-only and non-blocking streams.

   .. method:: isatty()

      Return ``True`` if the stream is interactive (i.e., connected to
      a terminal/tty device).

   .. method:: readable()

      Return ``True`` if the stream can be read from.
      If ``False``, :meth:`!read` will raise :exc:`OSError`.

   .. method:: readline(size=-1, /)

      Read and return one line from the stream.  If *size* is specified, at
      most *size* bytes will be read.

      The line terminator is always ``b'\n'`` for binary files; for text files,
      the *newline* argument to :func:`open` can be used to select the line
      terminator(s) recognized.

   .. method:: readlines(hint=-1, /)

      Read and return a list of lines from the stream.  *hint* can be specified
      to control the number of lines read: no more lines will be read if the
      total size (in bytes/characters) of all lines so far exceeds *hint*.

      *hint* values of ``0`` or less, as well as ``None``, are treated as no
      hint.

      Note that it's already possible to iterate on file objects using ``for
      line in file: ...`` without calling :meth:`!file.readlines`.

   .. method:: seek(offset, whence=os.SEEK_SET, /)

      Change the stream position to the given byte *offset*,
      interpreted relative to the position indicated by *whence*,
      and return the new absolute position.
      Values for *whence* are:

      * :data:`os.SEEK_SET` or ``0`` -- start of the stream (the default);
        *offset* should be zero or positive
      * :data:`os.SEEK_CUR` or ``1`` -- current stream position;
        *offset* may be negative
      * :data:`os.SEEK_END` or ``2`` -- end of the stream;
        *offset* is usually negative

      .. versionadded:: 3.1
         The :data:`!SEEK_*` constants.

      .. versionadded:: 3.3
         Some operating systems could support additional values, like
         :const:`os.SEEK_HOLE` or :const:`os.SEEK_DATA`. The valid values
         for a file could depend on it being open in text or binary mode.

   .. method:: seekable()

      Return ``True`` if the stream supports random access.  If ``False``,
      :meth:`seek`, :meth:`tell` and :meth:`truncate` will raise :exc:`OSError`.

   .. method:: tell()

      Return the current stream position.

   .. method:: truncate(size=None, /)

      Resize the stream to the given *size* in bytes (or the current position
      if *size* is not specified).  The current stream position isn't changed.
      This resizing can extend or reduce the current file size.  In case of
      extension, the contents of the new file area depend on the platform
      (on most systems, additional bytes are zero-filled).  The new file size
      is returned.

      .. versionchanged:: 3.5
         Windows will now zero-fill files when extending.

   .. method:: writable()

      Return ``True`` if the stream supports writing.  If ``False``,
      :meth:`!write` and :meth:`truncate` will raise :exc:`OSError`.

   .. method:: writelines(lines, /)

      Write a list of lines to the stream.  Line separators are not added, so it
      is usual for each of the lines provided to have a line separator at the
      end.

   .. method:: __del__()

      Prepare for object destruction. :class:`IOBase` provides a default
      implementation of this method that calls the instance's
      :meth:`~IOBase.close` method.


.. class:: RawIOBase

   Base class for raw binary streams.  It inherits from :class:`IOBase`.

   Raw binary streams typically provide low-level access to an underlying OS
   device or API, and do not try to encapsulate it in high-level primitives
   (this functionality is done at a higher-level in buffered binary streams and text streams, described later
   in this page).

   :class:`RawIOBase` provides these methods in addition to those from
   :class:`IOBase`:

   .. method:: read(size=-1, /)

      Read up to *size* bytes from the object and return them.  As a convenience,
      if *size* is unspecified or -1, all bytes until EOF are returned.
      Otherwise, only one system call is ever made.  Fewer than *size* bytes may
      be returned if the operating system call returns fewer than *size* bytes.

      If 0 bytes are returned, and *size* was not 0, this indicates end of file.
      If the object is in non-blocking mode and no bytes are available,
      ``None`` is returned.

      The default implementation defers to :meth:`readall` and
      :meth:`readinto`.

   .. method:: readall()

      Read and return all the bytes from the stream until EOF, using multiple
      calls to the stream if necessary.

   .. method:: readinto(b, /)

      Read bytes into a pre-allocated, writable
      :term:`bytes-like object` *b*, and return the
      number of bytes read.  For example, *b* might be a :class:`bytearray`.
      If the object is in non-blocking mode and no bytes
      are available, ``None`` is returned.

   .. method:: write(b, /)

      Write the given :term:`bytes-like object`, *b*, to the
      underlying raw stream, and return the number of
      bytes written.  This can be less than the length of *b* in
      bytes, depending on specifics of the underlying raw
      stream, and especially if it is in non-blocking mode.  ``None`` is
      returned if the raw stream is set not to block and no single byte could
      be readily written to it.  The caller may release or mutate *b* after
      this method returns, so the implementation should only access *b*
      during the method call.


.. class:: BufferedIOBase

   Base class for binary streams that support some kind of buffering.
   It inherits from :class:`IOBase`.

   The main difference with :class:`RawIOBase` is that methods :meth:`read`,
   :meth:`readinto` and :meth:`write` will try (respectively) to read
   as much input as requested or to emit all provided data.

   In addition, if the underlying raw stream is in non-blocking mode, when the
   system returns would block :meth:`write` will raise :exc:`BlockingIOError`
   with :attr:`BlockingIOError.characters_written` and :meth:`read` will return
   data read so far or ``None`` if no data is available.

   Besides, the :meth:`read` method does not have a default
   implementation that defers to :meth:`readinto`.

   A typical :class:`BufferedIOBase` implementation should not inherit from a
   :class:`RawIOBase` implementation, but wrap one, like
   :class:`BufferedWriter` and :class:`BufferedReader` do.

   :class:`BufferedIOBase` provides or overrides these data attributes and
   methods in addition to those from :class:`IOBase`:

   .. attribute:: raw

      The underlying raw stream (a :class:`RawIOBase` instance) that
      :class:`BufferedIOBase` deals with.  This is not part of the
      :class:`BufferedIOBase` API and may not exist on some implementations.

   .. method:: detach()

      Separate the underlying raw stream from the buffer and return it.

      After the raw stream has been detached, the buffer is in an unusable
      state.

      Some buffers, like :class:`BytesIO`, do not have the concept of a single
      raw stream to return from this method.  They raise
      :exc:`UnsupportedOperation`.

      .. versionadded:: 3.1

   .. method:: read(size=-1, /)

      Read and return up to *size* bytes. If the argument is omitted, ``None``,
      or negative read as much as possible.

      Fewer bytes may be returned than requested. An empty :class:`bytes` object
      is returned if the stream is already at EOF. More than one read may be
      made and calls may be retried if specific errors are encountered, see
      :meth:`os.read` and :pep:`475` for more details. Less than size bytes
      being returned does not imply that EOF is imminent.

      When reading as much as possible the default implementation will use
      ``raw.readall`` if available (which should implement
      :meth:`RawIOBase.readall`), otherwise will read in a loop until read
      returns ``None``, an empty :class:`bytes`, or a non-retryable error. For
      most streams this is to EOF, but for non-blocking streams more data may
      become available.

      .. note::

         When the underlying raw stream is non-blocking, implementations may
         either raise :exc:`BlockingIOError` or return ``None`` if no data is
         available. :mod:`!io` implementations return ``None``.

   .. method:: read1(size=-1, /)

      Read and return up to *size* bytes, calling :meth:`~RawIOBase.readinto`
      which may retry if :py:const:`~errno.EINTR` is encountered per
      :pep:`475`. If *size* is ``-1`` or not provided, the implementation will
      choose an arbitrary value for *size*.

      .. note::

         When the underlying raw stream is non-blocking, implementations may
         either raise :exc:`BlockingIOError` or return ``None`` if no data is
         available. :mod:`!io` implementations return ``None``.

   .. method:: readinto(b, /)

      Read bytes into a pre-allocated, writable
      :term:`bytes-like object` *b* and return the number of bytes read.
      For example, *b* might be a :class:`bytearray`.

      Like :meth:`read`, multiple reads may be issued to the underlying raw
      stream, unless the latter is interactive.

      A :exc:`BlockingIOError` is raised if the underlying raw stream is in non
      blocking-mode, and has no data available at the moment.

   .. method:: readinto1(b, /)

      Read bytes into a pre-allocated, writable
      :term:`bytes-like object` *b*, using at most one call to
      the underlying raw stream's :meth:`~RawIOBase.read` (or
      :meth:`~RawIOBase.readinto`) method. Return the number of bytes read.

      A :exc:`BlockingIOError` is raised if the underlying raw stream is in non
      blocking-mode, and has no data available at the moment.

      .. versionadded:: 3.5

   .. method:: write(b, /)

      Write the given :term:`bytes-like object`, *b*, and return the number
      of bytes written (always equal to the length of *b* in bytes, since if
      the write fails an :exc:`OSError` will be raised).  Depending on the
      actual implementation, these bytes may be readily written to the
      underlying stream, or held in a buffer for performance and latency
      reasons.

      When in non-blocking mode, a :exc:`BlockingIOError` is raised if the
      data needed to be written to the raw stream but it couldn't accept
      all the data without blocking.

      The caller may release or mutate *b* after this method returns,
      so the implementation should only access *b* during the method call.


Raw File I/O
^^^^^^^^^^^^

.. class:: FileIO(name, mode='r', closefd=True, opener=None)

   A raw binary stream representing an OS-level file containing bytes data.  It
   inherits from :class:`RawIOBase`.

   The *name* can be one of two things:

   * a character string or :class:`bytes` object representing the path to the
     file which will be opened. In this case closefd must be ``True`` (the default)
     otherwise an error will be raised.
   * an integer representing the number of an existing OS-level file descriptor
     to which the resulting :class:`FileIO` object will give access. When the
     FileIO object is closed this fd will be closed as well, unless *closefd*
     is set to ``False``.

   The *mode* can be ``'r'``, ``'w'``, ``'x'`` or ``'a'`` for reading
   (default), writing, exclusive creation or appending. The file will be
   created if it doesn't exist when opened for writing or appending; it will be
   truncated when opened for writing. :exc:`FileExistsError` will be raised if
   it already exists when opened for creating. Opening a file for creating
   implies writing, so this mode behaves in a similar way to ``'w'``. Add a
   ``'+'`` to the mode to allow simultaneous reading and writing.

   The :meth:`~RawIOBase.read` (when called with a positive argument),
   :meth:`~RawIOBase.readinto` and :meth:`~RawIOBase.write` methods on this
   class will only make one system call.

   A custom opener can be used by passing a callable as *opener*. The underlying
   file descriptor for the file object is then obtained by calling *opener* with
   (*name*, *flags*). *opener* must return an open file descriptor (passing
   :mod:`os.open` as *opener* results in functionality similar to passing
   ``None``).

   The newly created file is :ref:`non-inheritable <fd_inheritance>`.

   See the :func:`open` built-in function for examples on using the *opener*
   parameter.

   .. versionchanged:: 3.3
      The *opener* parameter was added.
      The ``'x'`` mode was added.

   .. versionchanged:: 3.4
      The file is now non-inheritable.

   :class:`FileIO` provides these data attributes in addition to those from
   :class:`RawIOBase` and :class:`IOBase`:

   .. attribute:: mode

      The mode as given in the constructor.

   .. attribute:: name

      The file name.  This is the file descriptor of the file when no name is
      given in the constructor.


Buffered Streams
^^^^^^^^^^^^^^^^

Buffered I/O streams provide a higher-level interface to an I/O device
than raw I/O does.

.. class:: BytesIO(initial_bytes=b'')

   A binary stream using an in-memory bytes buffer.  It inherits from
   :class:`BufferedIOBase`.  The buffer is discarded when the
   :meth:`~IOBase.close` method is called.

   The optional argument *initial_bytes* is a :term:`bytes-like object` that
   contains initial data.

   Methods may be used from multiple threads without external locking in
   :term:`free-threaded builds <free-threaded build>`.

   :class:`BytesIO` provides or overrides these methods in addition to those
   from :class:`BufferedIOBase` and :class:`IOBase`:

   .. method:: getbuffer()

      Return a readable and writable view over the contents of the buffer
      without copying them.  Also, mutating the view will transparently
      update the contents of the buffer::

         >>> b = io.BytesIO(b"abcdef")
         >>> view = b.getbuffer()
         >>> view[2:4] = b"56"
         >>> b.getvalue()
         b'ab56ef'

      .. note::
         As long as the view exists, the :class:`BytesIO` object cannot be
         resized or closed.

      .. versionadded:: 3.2

   .. method:: getvalue()

      Return :class:`bytes` containing the entire contents of the buffer.


   .. method:: read1(size=-1, /)

      In :class:`BytesIO`, this is the same as :meth:`~BufferedIOBase.read`.

      .. versionchanged:: 3.7
         The *size* argument is now optional.

   .. method:: readinto1(b, /)

      In :class:`BytesIO`, this is the same as :meth:`~BufferedIOBase.readinto`.

      .. versionadded:: 3.5

.. class:: BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)

   A buffered binary stream providing higher-level access to a readable, non
   seekable :class:`RawIOBase` raw binary stream.  It inherits from
   :class:`BufferedIOBase`.

   When reading data from this object, a larger amount of data may be
   requested from the underlying raw stream, and kept in an internal buffer.
   The buffered data can then be returned directly on subsequent reads.

   The constructor creates a :class:`BufferedReader` for the given readable
   *raw* stream and *buffer_size*.  If *buffer_size* is omitted,
   :data:`DEFAULT_BUFFER_SIZE` is used.

   :class:`BufferedReader` provides or overrides these methods in addition to
   those from :class:`BufferedIOBase` and :class:`IOBase`:

   .. method:: peek(size=0, /)

      Return bytes from the stream without advancing the position. The number of
      bytes returned may be less or more than requested. If the underlying raw
      stream is non-blocking and the operation would block, returns empty bytes.

   .. method:: read(size=-1, /)

      In :class:`BufferedReader` this is the same as :meth:`io.BufferedIOBase.read`

   .. method:: read1(size=-1, /)

      In :class:`BufferedReader` this is the same as :meth:`io.BufferedIOBase.read1`

      .. versionchanged:: 3.7
         The *size* argument is now optional.

.. class:: BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)

   A buffered binary stream providing higher-level access to a writeable, non
   seekable :class:`RawIOBase` raw binary stream.  It inherits from
   :class:`BufferedIOBase`.

   When writing to this object, data is normally placed into an internal
   buffer.  The buffer will be written out to the underlying :class:`RawIOBase`
   object under various conditions, including:

   * when the buffer gets too small for all pending data;
   * when :meth:`flush` is called;
   * when a :meth:`~IOBase.seek` is requested (for :class:`BufferedRandom` objects);
   * when the :class:`BufferedWriter` object is closed or destroyed.

   The constructor creates a :class:`BufferedWriter` for the given writeable
   *raw* stream.  If the *buffer_size* is not given, it defaults to
   :data:`DEFAULT_BUFFER_SIZE`.

   :class:`BufferedWriter` provides or overrides these methods in addition to
   those from :class:`BufferedIOBase` and :class:`IOBase`:

   .. method:: flush()

      Force bytes held in the buffer into the raw stream.  A
      :exc:`BlockingIOError` should be raised if the raw stream blocks.

   .. method:: write(b, /)

      Write the :term:`bytes-like object`, *b*, and return the
      number of bytes written.  When in non-blocking mode, a
      :exc:`BlockingIOError` with :attr:`BlockingIOError.characters_written` set
      is raised if the buffer needs to be written out but the raw stream blocks.


.. class:: BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)

   A buffered binary stream providing higher-level access to a seekable
   :class:`RawIOBase` raw binary stream.  It inherits from :class:`BufferedReader`
   and :class:`BufferedWriter`.

   The constructor creates a reader and writer for a seekable raw stream, given
   in the first argument.  If the *buffer_size* is omitted it defaults to
   :data:`DEFAULT_BUFFER_SIZE`.

   :class:`BufferedRandom` is capable of anything :class:`BufferedReader` or
   :class:`BufferedWriter` can do.  In addition, :meth:`~IOBase.seek` and
   :meth:`~IOBase.tell` are guaranteed to be implemented.


.. class:: BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /)

   A buffered binary stream providing higher-level access to two non seekable
   :class:`RawIOBase` raw binary streams---one readable, the other writeable.
   It inherits from :class:`BufferedIOBase`.

   *reader* and *writer* are :class:`RawIOBase` objects that are readable and
   writeable respectively.  If the *buffer_size* is omitted it defaults to
   :data:`DEFAULT_BUFFER_SIZE`.

   :class:`BufferedRWPair` implements all of :class:`BufferedIOBase`\'s methods
   except for :meth:`~BufferedIOBase.detach`, which raises
   :exc:`UnsupportedOperation`.

   .. warning::

      :class:`BufferedRWPair` does not attempt to synchronize accesses to
      its underlying raw streams.  You should not pass it the same object
      as reader and writer; use :class:`BufferedRandom` instead.


Text I/O
^^^^^^^^

.. class:: TextIOBase

   Base class for text streams.  This class provides a character and line based
   interface to stream I/O.  It inherits from :class:`IOBase`.

   :class:`TextIOBase` provides or overrides these data attributes and
   methods in addition to those from :class:`IOBase`:

   .. attribute:: encoding

      The name of the encoding used to decode the stream's bytes into
      strings, and to encode strings into bytes.

   .. attribute:: errors

      The error setting of the decoder or encoder.

   .. attribute:: newlines

      A string, a tuple of strings, or ``None``, indicating the newlines
      translated so far.  Depending on the implementation and the initial
      constructor flags, this may not be available.

   .. attribute:: buffer

      The underlying binary buffer (a :class:`BufferedIOBase`
      or :class:`RawIOBase` instance) that :class:`TextIOBase` deals with.
      This is not part of the :class:`TextIOBase` API and may not exist
      in some implementations.

   .. method:: detach()

      Separate the underlying binary buffer from the :class:`TextIOBase` and
      return it.

      After the underlying buffer has been detached, the :class:`TextIOBase` is
      in an unusable state.

      Some :class:`TextIOBase` implementations, like :class:`StringIO`, may not
      have the concept of an underlying buffer and calling this method will
      raise :exc:`UnsupportedOperation`.

      .. versionadded:: 3.1

   .. method:: read(size=-1, /)

      Read and return at most *size* characters from the stream as a single
      :class:`str`.  If *size* is negative or ``None``, reads until EOF.

   .. method:: readline(size=-1, /)

      Read until newline or EOF and return a single :class:`str`.  If the stream is
      already at EOF, an empty string is returned.

      If *size* is specified, at most *size* characters will be read.

   .. method:: seek(offset, whence=SEEK_SET, /)

      Change the stream position to the given *offset*.  Behaviour depends on
      the *whence* parameter.  The default value for *whence* is
      :data:`!SEEK_SET`.

      * :data:`!SEEK_SET` or ``0``: seek from the start of the stream
        (the default); *offset* must either be a number returned by
        :meth:`TextIOBase.tell`, or zero.  Any other *offset* value
        produces undefined behaviour.
      * :data:`!SEEK_CUR` or ``1``: "seek" to the current position;
        *offset* must be zero, which is a no-operation (all other values
        are unsupported).
      * :data:`!SEEK_END` or ``2``: seek to the end of the stream;
        *offset* must be zero (all other values are unsupported).

      Return the new absolute position as an opaque number.

      .. versionadded:: 3.1
         The :data:`!SEEK_*` constants.

   .. method:: tell()

      Return the current stream position as an opaque number.  The number
      does not usually represent a number of bytes in the underlying
      binary storage.

   .. method:: write(s, /)

      Write the string *s* to the stream and return the number of characters
      written.


.. class:: TextIOWrapper(buffer, encoding=None, errors=None, newline=None, \
                         line_buffering=False, write_through=False)

   A buffered text stream providing higher-level access to a
   :class:`BufferedIOBase` buffered binary stream.  It inherits from
   :class:`TextIOBase`.

   *encoding* gives the name of the encoding that the stream will be decoded or
   encoded with.  In :ref:`UTF-8 Mode <utf8-mode>`, this defaults to UTF-8.
   Otherwise, it defaults to :func:`locale.getencoding`.
   ``encoding="locale"`` can be used to specify the current locale's encoding
   explicitly. See :ref:`io-text-encoding` for more information.

   *errors* is an optional string that specifies how encoding and decoding
   errors are to be handled.  Pass ``'strict'`` to raise a :exc:`ValueError`
   exception if there is an encoding error (the default of ``None`` has the same
   effect), or pass ``'ignore'`` to ignore errors.  (Note that ignoring encoding
   errors can lead to data loss.)  ``'replace'`` causes a replacement marker
   (such as ``'?'``) to be inserted where there is malformed data.
   ``'backslashreplace'`` causes malformed data to be replaced by a
   backslashed escape sequence.  When writing, ``'xmlcharrefreplace'``
   (replace with the appropriate XML character reference)  or ``'namereplace'``
   (replace with ``\N{...}`` escape sequences) can be used.  Any other error
   handling name that has been registered with
   :func:`codecs.register_error` is also valid.

   .. index::
      single: universal newlines; io.TextIOWrapper class

   *newline* controls how line endings are handled.  It can be ``None``,
   ``''``, ``'\n'``, ``'\r'``, and ``'\r\n'``.  It works as follows:

   * When reading input from the stream, if *newline* is ``None``,
     :term:`universal newlines` mode is enabled.  Lines in the input can end in
     ``'\n'``, ``'\r'``, or ``'\r\n'``, and these are translated into ``'\n'``
     before being returned to the caller.  If *newline* is ``''``, universal
     newlines mode is enabled, but line endings are returned to the caller
     untranslated.  If *newline* has any of the other legal values, input lines
     are only terminated by the given string, and the line ending is returned to
     the caller untranslated.

   * When writing output to the stream, if *newline* is ``None``, any ``'\n'``
     characters written are translated to the system default line separator,
     :data:`os.linesep`.  If *newline* is ``''`` or ``'\n'``, no translation
     takes place.  If *newline* is any of the other legal values, any ``'\n'``
     characters written are translated to the given string.

   If *line_buffering* is ``True``, :meth:`~IOBase.flush` is implied when a call to
   write contains a newline character or a carriage return.

   If *write_through* is ``True``, calls to :meth:`~BufferedIOBase.write` are guaranteed
   not to be buffered: any data written on the :class:`TextIOWrapper`
   object is immediately handled to its underlying binary *buffer*.

   .. versionchanged:: 3.3
      The *write_through* argument has been added.

   .. versionchanged:: 3.3
      The default *encoding* is now ``locale.getpreferredencoding(False)``
      instead of ``locale.getpreferredencoding()``. Don't change temporary the
      locale encoding using :func:`locale.setlocale`, use the current locale
      encoding instead of the user preferred encoding.

   .. versionchanged:: 3.10
      The *encoding* argument now supports the ``"locale"`` dummy encoding name.

   .. note::

      When the underlying raw stream is non-blocking, a :exc:`BlockingIOError`
      may be raised if a read operation cannot be completed immediately.

   :class:`TextIOWrapper` provides these data attributes and methods in
   addition to those from :class:`TextIOBase` and :class:`IOBase`:

   .. attribute:: line_buffering

      Whether line buffering is enabled.

   .. attribute:: write_through

      Whether writes are passed immediately to the underlying binary
      buffer.

      .. versionadded:: 3.7

   .. method:: reconfigure(*, encoding=None, errors=None, newline=None, \
                           line_buffering=None, write_through=None)

      Reconfigure this text stream using new settings for *encoding*,
      *errors*, *newline*, *line_buffering* and *write_through*.

      Parameters not specified keep current settings, except
      ``errors='strict'`` is used when *encoding* is specified but
      *errors* is not specified.

      It is not possible to change the encoding or newline if some data
      has already been read from the stream. On the other hand, changing
      encoding after write is possible.

      This method does an implicit stream flush before setting the
      new parameters.

      .. versionadded:: 3.7

      .. versionchanged:: 3.11
         The method supports ``encoding="locale"`` option.

   .. method:: seek(cookie, whence=os.SEEK_SET, /)

      Set the stream position.
      Return the new stream position as an :class:`int`.

      Four operations are supported,
      given by the following argument combinations:

      * ``seek(0, SEEK_SET)``: Rewind to the start of the stream.
      * ``seek(cookie, SEEK_SET)``: Restore a previous position;
        *cookie* **must be** a number returned by :meth:`tell`.
      * ``seek(0, SEEK_END)``: Fast-forward to the end of the stream.
      * ``seek(0, SEEK_CUR)``: Leave the current stream position unchanged.

      Any other argument combinations are invalid,
      and may raise exceptions.

      .. seealso::

         :data:`os.SEEK_SET`, :data:`os.SEEK_CUR`, and :data:`os.SEEK_END`.

   .. method:: tell()

      Return the stream position as an opaque number.
      The return value of :meth:`!tell` can be given as input to :meth:`seek`,
      to restore a previous stream position.


.. class:: StringIO(initial_value='', newline='\n')

   A text stream using an in-memory text buffer.  It inherits from
   :class:`TextIOBase`.

   The text buffer is discarded when the :meth:`~IOBase.close` method is
   called.

   The initial value of the buffer can be set by providing *initial_value*.
   If newline translation is enabled, newlines will be encoded as if by
   :meth:`~TextIOBase.write`.  The stream is positioned at the start of the
   buffer which emulates opening an existing file in a ``w+`` mode, making it
   ready for an immediate write from the beginning or for a write that
   would overwrite the initial value.  To emulate opening a file in an ``a+``
   mode ready for appending, use ``f.seek(0, io.SEEK_END)`` to reposition the
   stream at the end of the buffer.

   The *newline* argument works like that of :class:`TextIOWrapper`,
   except that when writing output to the stream, if *newline* is ``None``,
   newlines are written as ``\n`` on all platforms.

   :class:`StringIO` provides this method in addition to those from
   :class:`TextIOBase` and :class:`IOBase`:

   .. method:: getvalue()

      Return a :class:`str` containing the entire contents of the buffer.
      Newlines are decoded as if by :meth:`~TextIOBase.read`, although
      the stream position is not changed.

   Example usage::

      import io

      output = io.StringIO()
      output.write('First line.\n')
      print('Second line.', file=output)

      # Retrieve file contents -- this will be
      # 'First line.\nSecond line.\n'
      contents = output.getvalue()

      # Close object and discard memory buffer --
      # .getvalue() will now raise an exception.
      output.close()


.. index::
   single: universal newlines; io.IncrementalNewlineDecoder class

.. class:: IncrementalNewlineDecoder

   A helper codec that decodes newlines for :term:`universal newlines` mode.
   It inherits from :class:`codecs.IncrementalDecoder`.


Static Typing
-------------

The following protocols can be used for annotating function and method
arguments for simple stream reading or writing operations. They are decorated
with :deco:`typing.runtime_checkable`.

.. class:: Reader[T]

   Generic protocol for reading from a file or other input stream. ``T`` will
   usually be :class:`str` or :class:`bytes`, but can be any type that is
   read from the stream.

   .. versionadded:: 3.14

   .. method:: read()
               read(size, /)

      Read data from the input stream and return it. If *size* is
      specified, it should be an integer, and at most *size* items
      (bytes/characters) will be read.

   For example::

     def read_it(reader: Reader[str]):
         data = reader.read(11)
         assert isinstance(data, str)

.. class:: Writer[T]

   Generic protocol for writing to a file or other output stream. ``T`` will
   usually be :class:`str` or :class:`bytes`, but can be any type that can be
   written to the stream.

   .. versionadded:: 3.14

   .. method:: write(data, /)

      Write *data* to the output stream and return the number of items
      (bytes/characters) written.

   For example::

     def write_binary(writer: Writer[bytes]):
         writer.write(b"Hello world!\n")

See :ref:`typing-io` for other I/O related protocols and classes that can be
used for static type checking.

Performance
-----------

This section discusses the performance of the provided concrete I/O
implementations.

Binary I/O
^^^^^^^^^^

By reading and writing only large chunks of data even when the user asks for a
single byte, buffered I/O hides any inefficiency in calling and executing the
operating system's unbuffered I/O routines.  The gain depends on the OS and the
kind of I/O which is performed.  For example, on some modern OSes such as Linux,
unbuffered disk I/O can be as fast as buffered I/O.  The bottom line, however,
is that buffered I/O offers predictable performance regardless of the platform
and the backing device.  Therefore, it is almost always preferable to use
buffered I/O rather than unbuffered I/O for binary data.

Text I/O
^^^^^^^^

Text I/O over a binary storage (such as a file) is significantly slower than
binary I/O over the same storage, because it requires conversions between
unicode and binary data using a character codec.  This can become noticeable
handling huge amounts of text data like large log files.  Also,
:meth:`~TextIOBase.tell` and :meth:`~TextIOBase.seek` are both quite slow
due to the reconstruction algorithm used.

:class:`StringIO`, however, is a native in-memory unicode container and will
exhibit similar speed to :class:`BytesIO`.

Multi-threading
^^^^^^^^^^^^^^^

:class:`FileIO` objects are thread-safe to the extent that the operating system
calls (such as :manpage:`read(2)` under Unix) they wrap are thread-safe too.

Binary buffered objects (instances of :class:`BufferedReader`,
:class:`BufferedWriter`, :class:`BufferedRandom` and :class:`BufferedRWPair`)
protect their internal structures using a lock; it is therefore safe to call
them from multiple threads at once.

:class:`TextIOWrapper` objects are not thread-safe.

Reentrancy
^^^^^^^^^^

Binary buffered objects (instances of :class:`BufferedReader`,
:class:`BufferedWriter`, :class:`BufferedRandom` and :class:`BufferedRWPair`)
are not reentrant.  While reentrant calls will not happen in normal situations,
they can arise from doing I/O in a :mod:`signal` handler.  If a thread tries to
re-enter a buffered object which it is already accessing, a :exc:`RuntimeError`
is raised.  Note this doesn't prohibit a different thread from entering the
buffered object.

The above implicitly extends to text files, since the :func:`open` function
will wrap a buffered object inside a :class:`TextIOWrapper`.  This includes
standard streams and therefore affects the built-in :func:`print` function as
well.
