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
:
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
.
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.
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
- Standard library documentation for io
- ejemplo HTTP POST – Usa el método
detach()
deTextIOWrapper
para gestionar el envoltorio por separado del socket envuelto. - Concatenación eficiente de cadenas en Python – Examina Varios métodos de combinación de cadenas y sus méritos relativos.