io - Strumenti I/O per Flussi Grezzi, di Testo e Binari

Scopo: Implementa operazioni di input/output e fornisce classi per lavorare con i buffer usando API tipo file.

Il modulo io le classi che supportano il metodo built-in dell'interprete open() per operazioni di input e output basate su file. Le classi sono decomposte in modo tale che possano essere ricombinate per scopi alternativi, ad esempio per abilitare la scrittura di dati Unicode verso un socket di rete.

Flussi In Memoria

StringIO fornisce mezzi per lavorare comodamente con del testo in memoria utilizzando le API di file(read, write(), ecc.). L'utilizzo di StringIO per costruire grandi stringhe può offrire in taluni casi risparmi in prestazioni rispetto ad alcune altre tecniche di concatenamento di stringhe. I buffer di flusso in memoria sono anche utili per test, quando la scrittura verso un file reale potrebbe rallentare la suite di test.

Ecco alcuni esempi standard dell'utilizzo dei buffer StringIO.

# io_stringio.py

import io

# Scrittura verso un buffer
output = io.StringIO()
output.write('Questo va nel buffer. ')
print('Anche questo.', file=output)

# Recupero dei valori scritti
print(output.getvalue())

output.close()  # scarica il buffer in memoria

# Inizializza un buffer in lettura
input = io.StringIO('Valore iniziale per il buffer in lettura')

# Legge dal buffer
print(input.read())

Questo esempio usa read(), ma sono disponibili anche i metodi readline() e readlines(). La classe StringIO fornisce anche un metodo seek() per muoversi all'interno del buffer quando si è in lettura, utile per "riavvolgere" se si sta utilizzando un algoritmo di elaborazione di tipo look-ahead.

$ python3 io_stringio.py

Questo va nel buffer. Anche questo.

Valore iniziale per il buffer in lettura

Per lavorare con bite grezzi invece che con testo Unicode, si usa BytesIO.

# io_bytesio.py

import io

# Scrittura verso un buffer
output = io.BytesIO()
output.write('Questo va nel buffer. '.encode('utf-8'))
output.write('ÁÇÊ'.encode('utf-8'))

# Recupero dei valori scritti
print(output.getvalue())

output.close()  # scarica il buffer in memoria

# Inizializza un buffer in lettura
input = io.BytesIO(b'Valore iniziale per il buffer in lettura')

# Legge dal buffer
print(input.read())

I valori scritti verso BytesIO devono essere di tipo bytes, non str.

$ python3 io_bytesio.py

b'Questo va nel buffer. \xc3\x81\xc3\x87\xc3\x8a'
b'Valore iniziale per il buffer in lettura'

Impacchettare Flussi di Byte per Dati di Testo

Flussi di byte grezzi come i socket possono essere impacchettati in uno strato per gestire la codifica e la decodifica, facilitandone l'uso con dati di testo. La classe TextIOWrapper supporta sia la lettura che la scrittura. L'argomento write_through disabilita il buffering, e scarica tutti i dati scritti all'impacchettatore verso il buffer sottostante immediatamente.

# io_textiowrapper.py

import io

# Scrittura verso un buffer
output = io.BytesIO()
wrapper = io.TextIOWrapper(
    output,
    encoding='utf-8',
    write_through=True,
)
wrapper.write('Questo va nel buffer. ')
wrapper.write('ÁÇÊ')

# Recupero dei valori scritti
print(output.getvalue())

output.close()  # scarica il buffer in memoria

# Inizializza un buffer in lettura
input = io.BytesIO(
    b'Valore iniziale per il buffer in lettura' + 'ÁÇÊ'.encode('utf-8')
)
wrapper = io.TextIOWrapper(input, encoding='utf-8')

# Legge dal buffer
print(wrapper.read())

Questo esempio usa una istanza di BytesIO() come flusso.

$ python3 io_textiowrapper.py

b'Questo va nel buffer. \xc3\x81\xc3\x87\xc3\x8a'
Valore iniziale per il buffer in letturaÁÇÊ

Vedere anche:

io
La documentazione della libreria standard per questo modulo.
Efficient String Concatenation in Python
Esamina vari metodi di combinazione di stringhe e i loro relativi pregi - in inglese.