io — Herramientas de E / S de flujo de texto, binario y en bruto

Propósito:Implementa E/S de archivos y proporciona clases para trabajar con buffers utilizando intrfaz de programación de tipo archivo.

El módulo io implementa las clases detrás de la función open() incorporada del intérprete para operaciones de entrada y salida basadas en archivos. Las clases se descomponen de tal manera que pueden ser recombinadas para fines alternativos, por ejemplo, para permitir la escritura de datos Unicode en un socket de red.

Transmisiones en memoria

StringIO proporciona un medio conveniente para trabajar con texto en memoria utilizando la interfaz de programación de archivo (read(), write(), etc.). Utilizar StringIO para construir cadenas grandes puede ofrecer ahorros en el rendimiento obre algunas otras técnicas de concatenación de cuerdas en algunos casos. Los buffers de flujo en memoria también son útiles para pruebas, donde escribir en un archivo real en el disco puede ralentizar el conjunto de pruebas.

Aquí hay algunos ejemplos estándar del uso de buffers StringIO:

io_stringio.py
import io

# Writing to a buffer
output = io.StringIO()
output.write('This goes into the buffer. ')
print('And so does this.', file=output)

# Retrieve the value written
print(output.getvalue())

output.close()  # discard buffer memory

# Initialize a read buffer
input = io.StringIO('Inital value for read buffer')

# Read from the buffer
print(input.read())

Este ejemplo usa read(), pero los métodos readline() y readlines() también están disponibles. La clase StringIO también proporciona un método seek() para saltar alrededor de un bufer durante la lectura, lo que puede ser útil para rebobinar si se está utilizando un algoritmo de análisis de anticipación.

$ python3 io_stringio.py

This goes into the buffer. And so does this.

Inital value for read buffer

Para trabajar con bytes en bruto en lugar de texto Unicode, usa BytesIO.

io_bytesio.py
import io

# Writing to a buffer
output = io.BytesIO()
output.write('This goes into the buffer. '.encode('utf-8'))
output.write('ÁÇÊ'.encode('utf-8'))

# Retrieve the value written
print(output.getvalue())

output.close()  # discard buffer memory

# Initialize a read buffer
input = io.BytesIO(b'Inital value for read buffer')

# Read from the buffer
print(input.read())

Los valores escritos en BytesIO deben ser bytes en lugar de str.

$ python3 io_bytesio.py

b'This goes into the buffer. \xc3\x81\xc3\x87\xc3\x8a'
b'Inital value for read buffer'

Envolver flujos de bytes para datos de texto

Los flujos de bytes sin procesar, como los sockets, se pueden envolver con una capa para manejar codificación y decodificación de cadenas, lo que facilita su uso con datos de texto. La clase TextIOWrapper admite escritura, así como lectura. El argumento write_through deshabilita el almacenamiento en bufer, y vacía todos los datos escritos en el envoltorio hasta el bufer inmediatamente subyacente.

io_textiowrapper.py
import io

# Writing to a buffer
output = io.BytesIO()
wrapper = io.TextIOWrapper(
    output,
    encoding='utf-8',
    write_through=True,
)
wrapper.write('This goes into the buffer. ')
wrapper.write('ÁÇÊ')

# Retrieve the value written
print(output.getvalue())

output.close()  # discard buffer memory

# Initialize a read buffer
input = io.BytesIO(
    b'Inital value for read buffer with unicode characters ' +
    'ÁÇÊ'.encode('utf-8')
)
wrapper = io.TextIOWrapper(input, encoding='utf-8')

# Read from the buffer
print(wrapper.read())

Este ejemplo utiliza una instancia de BytesIO como la secuencia. Ejemplos para bz2, http.server, y subprocess usando TextIOWrapper con otros tipos de objetos tipo archivo.

$ python3 io_textiowrapper.py

b'This goes into the buffer. \xc3\x81\xc3\x87\xc3\x8a'
Inital value for read buffer with unicode characters ÁÇÊ

Ver también