| Scopo | Lavorare con i buffer di testo usando le API tipo file |
| Versione Python | StringIO: 1.4, cStringIO: 1.5 |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per le versioni 3.x di Python
La classe StringIO fornisce comodi strumenti per lavorare con del testo in memoria usando le API di file (read, write, ecc.). Ci sono due implementazioni distinte. Il modulo cStringIO è scritto in C per privilegiare la velocità, mentre il modulo StringIO è scritto in Python per privilegiare la portabilità. L'uso di cStringIO per costruire grandi stringhe può offrire un risparmio nelle prestazioni rispetto ad altre tecniche di concatenazione di stringhe.
Ecco alcuni semplici esempi standard circa l'uso dei buffer di StringIO:
# Trovare la miglior implementazione disponibile su questa piattaforma
try:
from cStringIO import StringIO
except:
from StringIO import StringIO
# Scrivere in un buffer
output = StringIO()
output.write('Questo va nel buffer. ')
print >>output, 'Ed anche questo.'
# Recuperare i valori scritti
print output.getvalue()
output.close() # scaricare il buffer dalla memoria
# Iniizializzare un buffer per la lettura
input = StringIO('Valore iniziale per il buffer in lettura')
# Leggere dal buffer
print input.read()
Questo esempio usa
read()
, ma naturalmente sono disponibili anche i metodi
readline()
e
readlines()
. La classe StringIO fornisce anche un metodo seek() così che sia possibile spostarsi all'interno del buffer mentre si sta leggendo, la qual cosa può essere utile per risalire il buffer se si sta usando una qualche forma di algoritmo di parsing look-ahead.
Le applicazioni nel mondo reale di StringIO includono uno stack di una applicazione web dove le varie parti dello stack possono aggiungere testo alla risposta, oppure il testare il risultato generato da parti di un programma che tipicamente scrivono in un file.
L'applicazione che stiamo realizzando al lavoro comprende una interfaccia allo shell scripting nella forma di parecchi programmi da riga comando. Alcuni di questi programmi sono responsabili del recupero di dati dal database e dello scarico sulla console (sia per mostrarlo all'utente, oppure affinchè il testo possa servire come input per un altro comando). I comandi condividono un insieme di plugin di formattazione per produrre una rappresentazione testuale di un oggetto in svariati modi (XML, sintassi bash, leggibili, ecc). Visto che i formattatori in genere scrivono sullo standard output, il test dei risulati risulterebbe un tantino complicato senza il modulo StringIO. L'uso di StringIO per intercettare l'output del formattatore fornisce un facile modo per raccogliere l'output in memoria per confrontarlo con i risultati che ci si aspetta.
Vedere anche: