"io" --- Herramientas principales para trabajar con *streams*
*************************************************************

**Código fuente:** Lib/io.py

======================================================================


Resumen
=======

El módulo "io" provee las facilidades principales de Python para
manejar diferentes tipos de E/S. Hay tres diferentes tipos de E/S:
*texto E/S*, *binario E/S* e *E/S sin formato*. Estas son categorías
generales y varios respaldos de almacenamiento se pueden usar para
cada una de ellas. Un objeto concreto perteneciendo a cualquiera de
estas categorías se llama un *file object*. Otros términos comunes son
*stream* y *file-like object*.

Independiente de su categoría, cada objeto *stream* también tendrá
varias capacidades: puede ser solamente para lectura, solo escritura,
or lectura y escritura. También permite arbitrariamente acceso
aleatorio (buscando adelante o hacia atrás en cualquier lugar) o
solamente acceso secuencial (por ejemplo en el caso de un *socket* o
*pipe*).

All streams are careful about the type of data you give to them.  For
example giving a "str" object to the "write()" method of a binary
stream will raise a "TypeError".  So will giving a "bytes" object to
the "write()" method of a text stream.

Distinto en la versión 3.3: Operaciones que lanzarán un "IOError"
ahora lanzan "OSError", ya que "IOError" es un alias de "OSError".


E/S Texto
---------

E/S de tipo texto espera y produce objetos de clase "str". Esto
significa que cuando el respaldo de almacenamiento está compuesto de
forma nativa de *bytes* (como en el caso de un archivo), la
codificación y descodificación de datos está hecho de forma
transparente tanto como traducción opcional de caracteres de nueva
línea específicos de la plataforma.

La manera más fácil de crear un *stream* de tipo texto es con el
método "open()", con la opción de especificar una codificación:

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

*Streams* de texto en memoria también están disponibles como objetos
de tipo "StringIO":

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

El *API* (interfaz de programación de aplicaciones) de *streams* tipo
texto está descrito con detalle en la documentación de "TextIOBase".


E/S Binaria
-----------

E/S binaria (también conocido como *buffered E/S*) espera *objetos
tipo bytes* y produce objetos tipo "bytes". No se hace codificación,
descodificación, o traducciones de nueva línea. Esta categoría de
*streams* puede ser usada para todos tipos de datos sin texto, y
también cuando se desea control manual sobre el manejo de dato
textual.

La manera más fácil para crear un *stream* binario es con el método
"open()" con "'b'" en el modo de la cadena de caracteres:

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

Los *streams* binarios en memoria también están disponibles como
objetos tipo "BytesIO":

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

El *API* de *stream* binario está descrito con detalle en la
documentación de "BufferedIOBase".

Otros módulos bibliotecarios pueden proveer maneras alternativas para
crear *streams* de tipo texto o binario. Ver
"socket.socket.makefile()" como ejemplo.


E/S sin formato
---------------

E/S sin formato (también conocido como *unbuffered E/S*) es
generalmente usado como un fundamento de nivel bajo para *streams*
binario y tipo texto; es raramente útil para manipular directamente
*streams* sin formatos del código de usuario. Sin embargo puedes crear
un *stream* sin formato abriendo un archivo en modo binario con el
búfer apagado:

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

El *API* de *streams* sin formato está descrito con detalle en la
documentación de "RawIOBase".


Codificación de texto
=====================

The default encoding of "TextIOWrapper" and "open()" is locale-
specific ("locale.getencoding()").

Sin embargo, muchos desarrolladores olvidan especificar la
codificación al abrir archivos de texto codificados en UTF-8 (por
ejemplo, JSON, TOML, Markdown, etc.) ya que la mayoría de las
plataformas Unix usan la configuración regional UTF-8 de forma
predeterminada. Esto causa errores porque la codificación local no es
UTF-8 para la mayoría de los usuarios de Windows. Por ejemplo:

   # 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.

Ver también:

  Modo Python UTF-8
     El modo UTF-8 de Python se puede utilizar para cambiar la
     codificación predeterminada a UTF-8 desde la codificación
     específica de la configuración regional.

  **PEP 686**
     Python 3.15 hará que Modo Python UTF-8 sea el valor
     predeterminado.


EncodingWarning opcional
------------------------

Nuevo en la versión 3.10: Consulte **PEP 597** para más detalles.

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

Si está proporcionando una API que usa "open()" o "TextIOWrapper" y
pasa "encoding=None" como parámetro, puede usar "text_encoding()" para
que las personas que llaman a la API emitan un "EncodingWarning" si no
pasan un "encoding". Sin embargo, considere usar UTF-8 de forma
predeterminada (es decir, "encoding="utf-8"") para las nuevas API.


Interfaz de módulo de alto nivel
================================

io.DEFAULT_BUFFER_SIZE

   Un *int* que contiene el búfer de tamaño predeterminado usado por
   las clases de tipo E/S. "open()" utiliza el *blksize* del archivo
   (obtenido por "os.stat()") si es posible.

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

   Esto es un alias para la función incorporada "open()".

   Lanza un auditing event "open" con los argumentos "path", "mode",
   "flags".

io.open_code(path)

   Abre el archivo dado con el modo "'rb'". Esta función debe ser
   usado cuando la intención es tratar el contenido como código
   ejecutable.

   *path* should be a "str" and an absolute path.

   The behavior of this function may be overridden by an earlier call
   to the "PyFile_SetOpenCodeHook()". However, assuming that *path* is
   a "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.

   Nuevo en la versión 3.8.

io.text_encoding(encoding, stacklevel=2, /)

   Esta es una función auxiliar para personas que llaman que usan
   "open()" o "TextIOWrapper" y tienen un parámetro "encoding=None".

   This function returns *encoding* if it is not "None". Otherwise, it
   returns ""locale"" or ""utf-8"" depending on UTF-8 Mode.

   This function emits an "EncodingWarning" if
   "sys.flags.warn_default_encoding" 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()

   En este ejemplo, se emite un "EncodingWarning" para el llamador de
   "read_text()".

   Consulte Codificación de texto para obtener más información.

   Nuevo en la versión 3.10.

   Distinto en la versión 3.11: "text_encoding()" retornará "utf-8"
   cuando esté habilitado el modo UTF-8 y el *encoding* es "None".

exception io.BlockingIOError

   Esto es un alias de compatibilidad para la incorporada excepción
   "BlockingIOError".

exception io.UnsupportedOperation

   Una excepción heredando "OSError" y "ValueError" que es generado
   cuando se llama a una operación no admitida en un *stream*.

Ver también:

  "sys"
     contiene los *streams* estándar de IO "sys.stdin", "sys.stdout",
     y "sys.stderr".


Jerarquía de clases
===================

La implementación de *streams* E/S está organizada como una jerarquía
de clases. Primero *abstract base classes* (ABC), que son usados para
especificar las varias categorías de *streams*, luego las clases
concretas proveen un *stream* estándar de implementaciones.

Nota:

  The abstract base classes also provide default implementations of
  some methods in order to help implementation of concrete stream
  classes.  For example, "BufferedIOBase" provides unoptimized
  implementations of "readinto()" and "readline()".

En la parte superior de la jerarquía E/S está la clase abstracta base
"IOBase". Define la interfaz básica del *stream*. Tenga en cuenta que
no hay separación entre *streams* de lectura y escritura;
implementaciones están permitidos lanzar "UnsupportedOperation" si no
apoyan la operación.

La clase "RawIOBase" extiende "IOBase". Maneja la lectura y escritura
de bytes a un *stream*. "FileIO" subclasifica "RawIOBase" para proveer
una interfaz a los archivos en el sistema de archivos de la máquina.

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

El "TextIOBase" ABC, otra subclasificación de "IOBase", trata con los
streams cuyos bytes representan texto, y maneja la codificación y
decodificación para cadenas de caracteres y de estos mismos.
"TextIOWrapper", que extiende "TextIOBase", es un interfaz textual
almacenado un *stream* sin formato amortiguado ("BufferedIOBase").
Finalmente, "StringIO"  es una stream en memoria para texto.

Los nombres de los argumentos no son parte de la especificación, y
solo los argumentos de "open()" están destinados a ser utilizados como
argumentos de palabras clave.

La siguiente tabla resume los ABC proporcionado por el módulo "io"
module:

+---------------------------+--------------------+--------------------------+----------------------------------------------------+
| ABC                       | Hereda             | Métodos de trozos        | Métodos mixin y propiedades                        |
|                           |                    | (*Stub*)                 |                                                    |
|===========================|====================|==========================|====================================================|
| "IOBase"                  |                    | "fileno", "seek", and    | "close", "closed", "__enter__", "__exit__",        |
|                           |                    | "truncate"               | "flush", "isatty", "__iter__", "__next__",         |
|                           |                    |                          | "readable", "readline", "readlines", "seekable",   |
|                           |                    |                          | "tell", "writable", and "writelines"               |
+---------------------------+--------------------+--------------------------+----------------------------------------------------+
| "RawIOBase"               | "IOBase"           | "readinto" and "write"   | Métodos "IOBase" heredados, "read", and "readall"  |
+---------------------------+--------------------+--------------------------+----------------------------------------------------+
| "BufferedIOBase"          | "IOBase"           | "detach", "read",        | Métodos "IOBase" heredados, "readinto", and        |
|                           |                    | "read1", and "write"     | "readinto1"                                        |
+---------------------------+--------------------+--------------------------+----------------------------------------------------+
| "TextIOBase"              | "IOBase"           | "detach", "read",        | Métodos "IOBase" heredados, "encoding", "errors",  |
|                           |                    | "readline", and "write"  | and "newlines"                                     |
+---------------------------+--------------------+--------------------------+----------------------------------------------------+


Clases base E/S
---------------

class io.IOBase

   La clase base abstracta para todas las clases de E/S.

   Esta clase provee implementaciones abstractas vacías para muchos
   métodos que clases que derivadas pueden anular selectivamente; la
   implementación predeterminada representa un archivo que no se puede
   leer, grabar o ser buscado.

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

   El tipo básico usado para leer datos binarios o grabar un archivo
   es "bytes". Otros *bytes-like objects* son aceptados como
   argumentos para métodos también. Clases de tipo E/S funcionan
   usando datos de tipo "str".

   Tenga en cuenta que llamando cualquier método (incluso
   indagaciones) en un *stream* cerrada es indefinido. En este caso
   implementaciones podrían lanzar un error "ValueError".

   "IOBase" (y sus subclasificaciones) apoyan el protocolo iterador,
   significando que un objeto de clase "IOBase" puede ser iterado
   sobre el rendimiento de las líneas en un *stream* de datos. Líneas
   son definidas un poco diferente dependiendo si el *stream* es de
   tipo binario (produciendo *bytes*), o un *stream* de texto
   (produciendo cadenas de caracteres). Ver "readline()" abajo.

   "IOBase" es también un gestor de contexto y por ende apoya la
   declaración "with". En este ejemplo, *file* es cerrado después de
   que la declaración "with" termina--incluso si alguna excepción
   ocurre:

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

   "IOBase" provee los siguientes atributos y métodos:

   close()

      Cierra el *stream*. Este método no tiene efecto si el archivo ya
      está cerrado. Cuándo está cerrado, cualquier operación que se le
      haga al archivo (ej. leer or grabar) lanzará el error
      "ValueError".

      Como conveniencia, se permite llamar este método más que una
      vez. Sin embargo, solamente el primer llamado tenderá efecto.

   closed

      "True" si está cerrada el *stream*.

   fileno()

      Retorna el descriptor de archivo subyacente (un número de tipo
      entero) de el *stream* si existe. Un "OSError" se lanza si el
      objeto IO no tiene un archivo descriptor.

   flush()

      Vacía los buffers de grabación del *stream* si corresponde. Esto
      no hace nada para *streams* que son solamente de lectura o
      *streams* sin bloqueo.

   isatty()

      Retorna "True"  si el *stream* es interactiva (ej., si está
      conectado a un terminal o dispositivo tty).

   readable()

      Return "True" if the stream can be read from. If "False",
      "read()" will raise "OSError".

   readline(size=-1, /)

      Lee y retorna una línea del *stream*. Si *size* (tamaño) es
      especificado, se capturará un máximo de ése mismo tamaño
      especificado en *bytes*.

      El terminador de la línea siempre es "b'\n'" para archivos de
      tipo binario; para archivos de tipo texto el argumento *newline*
      para la función "open()" pueden ser usados para seleccionar las
      líneas terminadoras reconocidas.

   readlines(hint=-1, /)

      Lee y retorna una lista de líneas del *stream*. *hint* puede ser
      especificado para controlar el número de líneas que se lee: no
      se leerán más líneas si el tamaño total (en *bytes* /
      caracteres) de todas las líneas excede *hint*.

      Los valores *hint* de "0" o menos, así como "None", se tratan
      como sin pista.

      Note that it's already possible to iterate on file objects using
      "for line in file: ..." without calling "file.readlines()".

   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:

      * "os.SEEK_SET" or "0" -- start of the stream (the default);
        *offset* should be zero or positive

      * "os.SEEK_CUR" or "1" -- current stream position; *offset* may
        be negative

      * "os.SEEK_END" or "2" -- end of the stream; *offset* is usually
        negative

      Nuevo en la versión 3.1: The "SEEK_*" constants.

      Nuevo en la versión 3.3: Some operating systems could support
      additional values, like "os.SEEK_HOLE" or "os.SEEK_DATA". The
      valid values for a file could depend on it being open in text or
      binary mode.

   seekable()

      Retorna "True" si el *stream* apoya acceso aleatorio. Si retorna
      "False", "seek()", "tell()" y "truncate()"  lanzarán "OSError".

   tell()

      Retorna la posición actual del *stream*.

   truncate(size=None, /)

      Cambia el tamaño del *stream* al *size* dado en *bytes* (o la
      posición actual si no se especifica *size*). La posición actual
      del *stream* no se cambia. Este cambio de tamaño puede
      incrementar o reducir el tamaño actual del archivo. En caso de
      extensión, los contenidos del área del nuevo archivo depende de
      la plataforma (en la mayoría de los sistemas *bytes* adicionales
      son llenos de cero). Se retorna el nuevo tamaño del archivo.

      Distinto en la versión 3.5: *Windows* llenará los archivos con
      cero cuando extienda.

   writable()

      Return "True" if the stream supports writing.  If "False",
      "write()" and "truncate()" will raise "OSError".

   writelines(lines, /)

      Escribir una lista de líneas al *stream*. No se agrega
      separadores de líneas, así que es usual que las líneas tengan
      separador al final.

   __del__()

      Prepara para la destrucción de un objeto. "IOBase" proporciona
      una implementación dada de este método que ejecuta las
      instancias del método "close()".

class io.RawIOBase

   Base class for raw binary streams.  It inherits from "IOBase".

   Los flujos binarios sin procesar generalmente brindan acceso de
   bajo nivel a un dispositivo OS subyacente o API, y no intentan
   encapsularlos en primitivas de alto nivel (esta funcionalidad se
   realiza en un nivel superior en flujos binarios almacenados en
   búfer y flujos de texto, que se describen más adelante en esta
   página).

   "RawIOBase" proporciona estos métodos además de los de "IOBase":

   read(size=-1, /)

      Lee hasta el *size* de los *bytes* del objeto y los retorna.
      Como conveniencia si no se especifica *size* o es -1, se
      retornan todos los *bytes* hasta que se retorne el fin del
      archivo. Sino, se hace solo un llamado al sistema. Se pueden
      retornar menos de *size* *bytes* si la llamada del sistema
      operativo retorna menos de *size* *bytes*.

      Si se retorna 0 *bytes* y el *size* no era 0, esto indica que es
      el fin del archivo. Si el objeto está en modo sin bloqueo y no
      hay *bytes* disponibles, se retorna "None".

      La implementación dada difiera al método "readall()" y
      "readinto()".

   readall()

      Lee y retorna todos los *bytes* del *stream* hasta llegar al fin
      del archivo, usando, si es necesario, varias llamadas al
      *stream*.

   readinto(b, /)

      Lee *bytes* en objeto pre-asignado y grabable *bytes-like
      object* *b*, y retorna el número de *bytes* leído. Por ejemplo,
      *b* puede ser una clase de tipo "bytearray". Si el objeto está
      en modo sin bloquear y no hay *bytes* disponibles, se retorna
      "None".

   write(b, /)

      Escribe *bytes-like object* dado, *b*, al *stream* subyacente y
      retorna la cantidad de *bytes* grabadas. Esto puede ser menos
      que la longitud de *b* en *bytes*, dependiendo de la
      especificaciones del *stream* subyacente, especialmente si no
      está en modo no-bloqueo. "None" se retorna si el *stream* sin
      formato está configurado para no bloquear y ningún *byte* puede
      ser rápidamente grabada. El llamador puede deshacer o mutar *b*
      después que retorne este método, así que la implementación solo
      debería acceder *b* durante la ejecución al método.

class io.BufferedIOBase

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

   La diferencia principal de "RawIOBase" es que los métodos "read()",
   "readinto()" y "write()" intentarán (respectivamente) leer la
   cantidad de información solicitada o consumir toda la salida dada,
   a expensas de hacer más de una llamada al sistema.

   Adicionalmente, esos métodos pueden lanzar un "BlockingIOError" si
   el *stream* sin formato subyacente está en modo no bloqueo y no
   puede obtener or dar más datos; a diferencia de sus contrapartes
   "RawIOBase", estos nunca retornarán "None".

   Además, el método "read()" no tiene una implementación dada que
   difiere al método "readinto()".

   Una implementación típica de "BufferedIOBase" no debería heredar
   una implementación de "RawIOBase", es más, debería envolver como
   uno, así como hacen las clases "BufferedWriter" y "BufferedReader".

   "BufferedIOBase" proporciona o anula estos atributos y métodos de
   datos además de los de "IOBase":

   raw

      El *stream* sin formato subyacente ( una instancia "RawIOBase")
      que "BufferedIOBase" maneja. Esto no es parte de la API
      "BufferedIOBase" y posiblemente no exista en algunas
      implementaciones.

   detach()

      Separa el *stream* subyacente del búfer y lo retorna.

      Luego que el *stream* sin formato ha sido separado, el búfer
      está en un estado inutilizable.

      Algunos búfer, como "BytesIO", no tienen el concepto de un
      *stream* sin formato singular para retornar de este método.
      Lanza un "UnsupportedOperation".

      Nuevo en la versión 3.1.

   read(size=-1, /)

      Lee y retorna hasta *size* en *bytes*. Si el argumento está
      omitido, "None", o es negativo, los datos son leídos y
      retornados hasta que se alcance el fin del archivo. Un objeto
      "bytes" vacío se retorna si el *stream* está al final del
      archivo.

      Si el argumento es positivo, y el *stream* subyacente no es
      interactiva, varias lecturas sin formato pueden ser otorgadas
      para satisfacer la cantidad de *byte* (al menos que primero se
      llegue al fin del archivo). Pero para los *streams* sin formato
      interactivas, a lo sumo una lectura sin formato será  emitida y
      un resultado corto no implica que se haya llegado al fin del
      archivo.

      Un "BlockingIOError" se lanza si el *stream* subyacente está en
      modo no bloqueo y no tiene datos al momento.

   read1(size=-1, /)

      Lee y retorna hasta *size* en *bytes* con al menos una llamada
      al método "read()" (o "readinto()") del *stream* subyacente.
      Esto puede ser útil si estás implementando tu propio búfer por
      encima de un objeto "BufferedIOBase".

      Si *size* es "-1" (el valor dado) se retorna un monto arbitrario
      de *bytes* (más que cero al menos que se haya llegado al fin del
      archivo).

   readinto(b, /)

      Lee *bytes* a un objeto predeterminado y grabable *bytes-like
      object* *b* y retorna el número de *bytes* leídos. Por ejemplo,
      *b* puede ser un "bytearray".

      Como "read()", varias lecturas pueden ser otorgadas al *stream*
      sin formato subyacente al menos que esto último sea interactivo.

      Un "BlockingIOError" se lanza si el *stream* subyacente está en
      modo no bloqueo y no tiene datos al momento.

   readinto1(b, /)

      Leer *bytes* a un objeto predeterminado y grabable *bytes-like
      object* *b* usando por lo menos una llamada al método "read()"
      (o "readinto()") del *stream* subyacente. Retorna la cantidad de
      *bytes* leídas.

      Un "BlockingIOError" se lanza si el *stream* subyacente está en
      modo no bloqueo y no tiene datos al momento.

      Nuevo en la versión 3.5.

   write(b, /)

      Escribe el *bytes-like object* dado, *b*, y retorna el número de
      bytes grabados (siempre el equivalente en longitud de *b* en
      bytes, ya que si falla la grabación se lanza un "OSError").
      Dependiendo en la implementación actual estos bytes pueden ser
      grabados rápidamente al *stream* subyacente o mantenido en un
      búfer por razones de rendimiento y latencia.

      Cuando estás en modo no bloqueo, se lanza un "BlockingIOError"
      si los datos tenían que ser grabadas al *stream* sin formato
      pero no pudo aceptar todos los datos sin bloquear.

      El llamador puede otorgar o mutar *b* después que este método
      retorne algo, entonces la implementación debería acceder
      solamente a *b* durante la llamada al método.


Archivo sin formato E/S
-----------------------

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

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

   El *name* puede ser una de dos cosas:

   * una cadena de caracteres u objeto de tipo "bytes" representando
     la ruta del archivo en la que fue abierto. En este caso *closefd*
     es "True" (el valor dado) de otra manera un error será dada.

   * un *integer* representando el número de descriptores de archivos
     de nivel OS que resultan dando acceso a través del objeto
     "FileIO". Cuando el objeto *FileIO* está cerrado este fd cerrará
     también a no ser que *closefd* esté configurado a "False".

   El *mode* puede ser "'r'", "'w'", "'x'" o "'a'" para lectura (el
   valor dado), grabación, creación exclusiva o anexando. Si no existe
   el archivo se creará cuando se abra para grabar o anexar; se
   truncará cuando se abra para grabar. Se lanzará un error
   "FileExistsError"   si ya existe cuando se abra para crear.
   Abriendo un archivo para crear implica grabar entonces este modo se
   comporta similarmente a "'w'". Agrega un "'+'"  al modo para
   permitir lectura y grabación simultáneas.

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

   Un abridor personalizado puede ser usado pasando un llamador como
   *opener*. El descriptor de archivo subyacente es obtenido llamando
   *opener* con (*name*, *flags*). *opener* debe retornar un
   descriptor de archivo abierto (pasando "os.open" como *opener*
   resulta con funcionamiento similar a pasando "None").

   El archivo recién creado es non-inheritable.

   Ver la función incorporada "open()" para ejemplos usando el
   parámetro *opener*.

   Distinto en la versión 3.3: El parámetro *opener* fue agregado. El
   modo "'x'" fue agregado.

   Distinto en la versión 3.4: El archivo ahora no es heredable.

   "FileIO" proporciona estos atributos de datos además de los de
   "RawIOBase" y "IOBase":

   mode

      El modo dado en el constructor.

   name

      El nombre del archivo. Este es el descriptor del archivo cuando
      no se proporciona ningún nombre en el constructor.


*Streams* almacenados (búfer)
-----------------------------

*Streams* E/S almacenadas (búfer) proveen una interfaz de más alto
nivel a un dispositivo E/S que a un E/S sin formato.

class io.BytesIO(initial_bytes=b'')

   A binary stream using an in-memory bytes buffer.  It inherits from
   "BufferedIOBase".  The buffer is discarded when the "close()"
   method is called.

   El argumento opcional *initial_bytes* es un *bytes-like object* que
   contiene datos iniciales.

   "BytesIO" provee o anula estos métodos además de los de
   "BufferedIOBase" y "IOBase":

   getbuffer()

      Retorna una vista legible y grabable acerca de los contenidos
      del búfer sin copiarlos. Además mutando la vista actualizará de
      forma transparente los contenidos del búfer:

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

      Nota:

        Mientras exista la vista el objeto "BytesIO" no se le puede
        cambiar el tamaño o cerrado.

      Nuevo en la versión 3.2.

   getvalue()

      Retorna "bytes" que contiene los contenidos enteros del búfer.

   read1(size=-1, /)

      En la clase "BytesIO" esto es lo mismo que "read()".

      Distinto en la versión 3.7: Ahora es opcional el argumento
      *size*.

   readinto1(b, /)

      En la clase "BytesIO" esto es lo mismo que "readinto()".

      Nuevo en la versión 3.5.

class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)

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

   Al leer datos de este objeto, es posible que se solicite una mayor
   cantidad de datos del flujo sin procesar subyacente y se mantenga
   en un búfer interno. Los datos almacenados en búfer se pueden
   retornar directamente en lecturas posteriores.

   El constructor crea un "BufferedReader" para el *stream* legible
   sin formato *raw* y *buffer_size*. Si se omite *buffer_size* se usa
   "DEFAULT_BUFFER_SIZE".

   "BufferedReader" provee o anula los métodos en adición a los de
   "BufferedIOBase" y "IOBase":

   peek(size=0, /)

      Retorna *bytes* del *stream* sin avanzar la posición. Al menos
      una lectura se hace al *stream* sin formato para satisfacer el
      llamado. El número de bytes retornados puede ser menor o mayor
      al solicitado.

   read(size=-1, /)

      Lee y retorna *size* *bytes* o si no se da *size*, o es
      negativo, hasta el fin del archivo o si la llamada leída podría
      bloquear in modo no bloquear.

   read1(size=-1, /)

      Lee y retorna hasta el tamaño *size* en *bytes* con solo un
      llamado al *stream*. Si al menos un *byte* pasa por el proceso
      de búfer, solo se retornan *buffered bytes*. De lo contrario se
      realiza un llamado de lectura de un *stream* sin formato.

      Distinto en la versión 3.7: Ahora es opcional el argumento
      *size*.

class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)

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

   Al escribir en este objeto, los datos normalmente se colocan en un
   búfer interno. El búfer se escribirá en el objeto "RawIOBase"
   subyacente en varias condiciones, que incluyen:

   * cuando el búfer se vuelve demasiado pequeño para todos los datos
     pendientes;

   * when "flush()" is called;

   * when a "seek()" is requested (for "BufferedRandom" objects);

   * cuando el objeto "BufferedWriter" is cerrado o anulado.

   El constructor crea un "BufferedWriter" para el *stream* grabable
   *raw*. Si no es dado el *buffer_size*, recurre el valor
   "DEFAULT_BUFFER_SIZE".

   "BufferedWriter" provee o anula estos métodos además de los de
   "BufferedIOBase" y "IOBase":

   flush()

      Forzar bytes retenidos en el búfer al *stream* sin formato. Un
      "BlockingIOError" debería ser lanzado si el *stream* sin formato
      bloquea.

   write(b, /)

      Escribe el *bytes-like object*, *b*, y retorna el número de
      bytes grabados. Cuando estás en modo no-bloqueo, se lanza un
      "BlockingIOError" si el búfer tiene que ser escrito pero el
      *stream* sin formato bloquea.

class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)

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

   El constructor crea un lector y una grabación para un *stream* sin
   formato buscable, dado en el primer argumento. Si se omite el
   *buffer_size* este recae sobre el valor predeterminado
   "DEFAULT_BUFFER_SIZE".

   "BufferedRandom" is capable of anything "BufferedReader" or
   "BufferedWriter" can do.  In addition, "seek()" and "tell()" are
   guaranteed to be implemented.

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

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

   *reader* y *writer* son objetos "RawIOBase" que son respectivamente
   legibles y escribibles. Si se omite *buffer_size* este se recae
   sobre el valor predeterminado "DEFAULT_BUFFER_SIZE".

   "BufferedRWPair" implementa todos los métodos de "BufferedIOBase"
   excepto por "detach()", que lanza un "UnsupportedOperation".

   Advertencia:

     "BufferedRWPair" no intenta sincronizar accesos al *stream* sin
     formato subyacente. No debes pasar el mismo objeto como legible y
     escribible; usa "BufferedRandom" en su lugar.


E/S Texto
---------

class io.TextIOBase

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

   "TextIOBase" provee o anula estos atributos y métodos de datos
   además de los de "IOBase":

   encoding

      El nombre de la codificación utilizada para decodificar los
      *bytes* del *stream* a cadenas de caracteres y para codificar
      cadenas de caracteres en bytes.

   errors

      La configuración de error del decodificador o codificador.

   newlines

      Una cadena de caracteres, una tupla de cadena de caracteres, o
      "None", indicando las nuevas líneas traducidas hasta ese
      momento. Dependiendo de la implementación y los indicadores
      iniciales del constructor, esto puede no estar disponible.

   buffer

      El búfer binario subyacente (una instancia "BufferedIOBase") que
      maneja "TextIOBase". Esto no es parte del API de "TextIOBase" y
      puede no existir en algunas implementaciones.

   detach()

      Separa el búfer binario subyacente de "TextIOBase" y lo retorna.

      Una vez que se ha separado el búfer subyacente, la "TextIOBase"
      está en un estado inutilizable.

      Algunas implementaciones de "TextIOBase", como "StringIO", puede
      no tener el concepto de un búfer subyacente y llamar a este
      método se lanzará "UnsupportedOperation".

      Nuevo en la versión 3.1.

   read(size=-1, /)

      Lee y retorna como máximo *size* caracteres del *stream* como un
      "str" singular. Si *size* es negativo o "None", lee hasta llegar
      al fin del archivo.

   readline(size=-1, /)

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

      Si se especifica *size* como máximo *size* de caracteres será
      leído.

   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 "SEEK_SET".

      * "SEEK_SET" or "0": seek from the start of the stream (the
        default); *offset* must either be a number returned by
        "TextIOBase.tell()", or zero.  Any other *offset* value
        produces undefined behaviour.

      * "SEEK_CUR" or "1": "seek" to the current position; *offset*
        must be zero, which is a no-operation (all other values are
        unsupported).

      * "SEEK_END" or "2": seek to the end of the stream; *offset*
        must be zero (all other values are unsupported).

      Retorna la nueva posición absoluta como un número opaco.

      Nuevo en la versión 3.1: The "SEEK_*" constants.

   tell()

      Retorna la posición actual de la secuencia como un número opaco.
      El número no suele representar una cantidad de bytes en el
      almacenamiento binario subyacente.

   write(s, /)

      Escribe la cadena de caracteres *s* al *stream* y retorna el
      número de caracteres grabadas.

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

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

   *encoding* gives the name of the encoding that the stream will be
   decoded or encoded with.  It defaults to "locale.getencoding()".
   "encoding="locale"" can be used to specify the current locale's
   encoding explicitly. See Codificación de texto for more
   information.

   *errors* es una cadena de caracteres opcional que especifica cómo
   se manejan los errores codificados y descodificados. Pasa
   "'strict'" para lanzar una excepción "ValueError" si hay un error
   codificado (el valor predeterminado "None" tiene el mismo efecto),
   o pasa "'ignore'" para ignorar errores. (Tenga en cuenta que
   ignorar errores puede llevar a perder datos). "'replace'" causa un
   marcador de reemplazo (como "'?'") para ser insertado donde haya
   datos mal formados. "'backslashreplace'" reemplaza datos mal
   formados con una secuencia de escape de tipo barra invertida.
   Cuando se escribe, "'xmlcharrefreplace'"  (reemplazar con la
   referencia apropiada de XML) o "'namereplace'" (reemplazar con
   secuencias de caracteres "\N{…}") pueden ser usadas. Cualquier otro
   nombre de manejador de errores que hayan sido registrados con
   "codecs.register_error()" también son validas.

   *newline* controla cómo finalizar las terminaciones de líneas.
   Pueden ser "None", "''", "'\n'", "'\r'", and "'\r\n'". Funciona de
   la siguiente manera:

   * Al leer la entrada de la secuencia, si *newline* es "None", el
     modo *universal newlines* está habilitado. Las líneas de la
     entrada pueden terminar en "'\n'", "'\r'" o "'\r\n'", y se
     traducen a "'\n'" antes de retornarse al llamador. Si *newline*
     es "''", el modo de salto de línea universal está habilitado,
     pero los finales de línea se retornan a la persona que llama sin
     traducir. Si *newline* tiene alguno de los otros valores legales,
     las líneas de entrada solo terminan con la cadena dada y la línea
     final se retorna al llamador sin traducir.

   * Al escribir la salida al *stream*, si *newline* es "None",
     cualquier carácter "'\n'" escrito son traducidos a la línea
     separador *default* del sistema, "os.linesep". Si *newline* es
     "''" o "'\n'", la traducción no ocurre. Si *newline* es de
     cualquier de los otros valores legales, cualquier carácter "'\n'"
     escrito es traducido a la cadena de caracteres dada.

   If *line_buffering* is "True", "flush()" is implied when a call to
   write contains a newline character or a carriage return.

   If *write_through* is "True", calls to "write()" are guaranteed not
   to be buffered: any data written on the "TextIOWrapper" object is
   immediately handled to its underlying binary *buffer*.

   Distinto en la versión 3.3: Se ha agregado el argumento
   *write_through*.

   Distinto en la versión 3.3: La codificación (*encoding*) por
   defecto es ahora "locale.getpreferredencoding(False)" en vez de
   "locale.getpreferredencoding()". No cambie temporalmente la
   codificación local usando "locale.setlocale()", use la codificación
   local actual en vez del preferido del usuario.

   Distinto en la versión 3.10: El argumento *encoding* ahora admite
   el nombre de codificación ficticia ""locale"".

   "TextIOWrapper" proporciona estos atributos y métodos de datos
   además de los de "TextIOBase" y "IOBase":

   line_buffering

      Si el almacenamiento en línea está habilitado.

   write_through

      Si grabaciones son pasadas inmediatamente al búfer binario
      subyacente.

      Nuevo en la versión 3.7.

   reconfigure(*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None)

      Reconfigura este *stream* textual usando las nuevas
      configuraciones de *encoding*, *errors*, *newline*,
      *line_buffering* y *write_through*.

      Los parámetros que no son especificados mantienen las
      configuraciones actuales, excepto por "errors='strict'" cuando
      *encoding* se especifica pero *errors* no está especificado.

      No es posible cambiar la codificación o nueva línea si algunos
      datos han sido captados por el *stream*. Sin embargo, cambiando
      la codificación después de grabar es posible.

      Este método hace una nivelación implícita del *stream* antes de
      configurar los nuevos parámetros.

      Nuevo en la versión 3.7.

      Distinto en la versión 3.11: El método admite la opción
      "encoding="locale"".

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

      Set the stream position. Return the new stream position as an
      "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 "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.

      Ver también: "os.SEEK_SET", "os.SEEK_CUR", and "os.SEEK_END".

   tell()

      Return the stream position as an opaque number. The return value
      of "tell()" can be given as input to "seek()", to restore a
      previous stream position.

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

   A text stream using an in-memory text buffer.  It inherits from
   "TextIOBase".

   El búfer de texto se descarta cuando se llama al método "close()".

   El valor inicial del búfer se puede establecer proporcionando
   *initial_value*. Si la traducción de nuevas líneas está habilitada,
   las nuevas líneas se codificarán como si fueran "write()". La
   secuencia se coloca al comienzo del búfer que emula la apertura de
   un archivo existente en un modo "w+" , preparándolo para una
   escritura inmediata desde el principio o para una escritura que
   sobrescribiría el valor inicial. Para emular la apertura de un
   archivo en un modo "a+" listo para anexar, use "f.seek(0,
   io.SEEK_END)" para reponer la secuencia al final del búfer.

   El argumento *newline* funciona como el de la clase
   "TextIOWrapper", excepto que cuando escribe al flujo de salida, si
   *newline* es "None", se escriben líneas nuevas como "\n" en todas
   las plataformas

   "StringIO" proporciona este método además de los de "TextIOBase" y
   "IOBase":

   getvalue()

      Return a "str" containing the entire contents of the buffer.
      Newlines are decoded as if by "read()", although the stream
      position is not changed.

   Ejemplos de uso:

      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()

class io.IncrementalNewlineDecoder

   A helper codec that decodes newlines for *universal newlines* mode.
   It inherits from "codecs.IncrementalDecoder".


Rendimiento
===========

Esta sección discute el rendimiento de las implementaciones concretas
de E/S proporcionadas.


E/S Binaria
-----------

Leyendo y grabando solamente grandes porciones de datos incluso cuando
el usuario pide para solo un byte, E/S de tipo búfer esconde toda
ineficiencia llamando y ejecutando las rutinas E/S del sistema
operativo que no ha pasado por el proceso de búfer. La ganancia
depende en el OS y el tipo de E/S que se ejecuta. Por ejemplo, en
algunos sistemas operativos modernos como Linux, un disco E/S sin
búfer puede ser rápido como un E/S búfer. Al final, sin embargo, es
que el E/S búfer ofrece rendimiento predecible independientemente de
la plataforma y el dispositivo de respaldo. Entonces es siempre
preferible user E/S búfer que E/S sin búfer para datos binarios.


E/S Texto
---------

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, "tell()" and "seek()" are both quite slow due
to the reconstruction algorithm used.

"StringIO", sin embargo, es un contenedor unicode nativo en memoria y
exhibirá una velocidad similar a "BytesIO".


Multihilo
---------

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

Objetos binarios búfer (instancias de "BufferedReader",
"BufferedWriter", "BufferedRandom" y "BufferedRWPair") protegen sus
estructuras internas usando un bloqueo; es seguro, entonces, llamarlos
de varios hilos a la vez.

objetos "TextIOWrapper" no son seguros para subprocesos.


Reentrada
---------

Objetos binarios búfer (instancias de "BufferedReader",
"BufferedWriter", "BufferedRandom" y "BufferedRWPair") no son
reentrante. Mientras llamadas reentrantes no ocurren en situaciones
normales pueden surgir haciendo E/S en un manejador "signal". Si un
hilo trata de entrar de nuevo a un objeto búfer que se está accediendo
actualmente, se lanza un "RuntimeError". Tenga en cuenta que esto no
prohíbe un hilo diferente entrando un objeto búfer.

Lo anterior se extiende implícitamente a los archivos de texto, ya que
la función "open()" envolverá un objeto almacenado en búfer dentro de
un "TextIOWrapper". Esto incluye transmisiones estándar y, por lo
tanto, también afecta a la función "print()" incorporada.
