2011-11-03 14 views
58

Non sono un professionista e mi sono grattato per capire cosa usi esattamente StringIO. Ho cercato su internet per alcuni esempi. Tuttavia, quasi tutti gli esempi sono molto astratti. E mostrano solo "come" usarlo. Ma nessuno di loro mostra "perché" e "in quali circostanze" si dovrebbe/lo userà? Grazie in anticipoCosa si intende per StringIO in python nella realtà?

P.s non essere confuso con questa domanda su stackoverflow: StringIO Usage che confronta string e StringIo.

risposta

75

Viene utilizzato quando si dispone di API che accettano solo file, ma è necessario utilizzare una stringa. Ad esempio, per comprimere una stringa utilizzando il modulo gzip in Python 2:

import gzip 
import StringIO 

stringio = StringIO.StringIO() 
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w') 
gzip_file.write('Hello World') 
gzip_file.close() 

stringio.getvalue() 
+0

in altre parole: 'typing' anatra: D – Abdelouahab

+1

Da Python 3.2, il modulo gzip ha funzioni comprimere direttamente dati. (Ma qualsiasi libreria open source ben conosciuta che attualmente ha bisogno di StringIO probabilmente crescerà tali funzioni dopo qualche tempo, quindi piuttosto che cercare un nuovo esempio lascerò qui gzip.) –

27

StringIO offre un accesso di tipo file alle stringhe, quindi è possibile utilizzare un modulo esistente che si occupa di un file e modificare quasi nulla e farlo funzionare con le stringhe.

Ad esempio, si supponga di disporre di un programma di registrazione che scrive elementi su un file e si desidera invece inviare l'output del registro sulla rete. È possibile leggere il file e scrivere il suo contenuto sulla rete, oppure è possibile scrivere il registro su un oggetto StringIO e inviarlo alla destinazione di rete senza toccare il file system. StringIO rende facile farlo nel primo modo, quindi passa al secondo modo.

12

Nei casi in cui si desidera un oggetto simile a file che si comporta come un file, ma è la scrittura in un buffer di stringa in memoria: StringIO è lo strumento. Se stai costruendo stringhe di grandi dimensioni, come documenti di solo testo, e fai un sacco di concatenazioni di stringhe, potresti trovare più semplice usare StringIO invece di un gruppo di operazioni di tipo mystr += 'more stuff\n'.

+1

Ho anche trovato 'StringIO' da considerevolmente più veloce se si ha a che fare con più megabyte di dati di carattere rispetto a espressioni come 'mystr + =" più cose \ n "in un ciclo, specialmente se si può usare' cStringIO.StringIO' invece di solo 'io.StringIO '. – SeldomNeedy

8

paio di cose che personalmente ho usato per:

  1. intero file nella cache. Ho uno script che legge i PDF e fa la convalida di varie cose su di loro. La libreria PDF che sto usando prende un file aperto nel suo costruttore di documenti. Inizialmente avevo appena aperto il PDF che mi interessava leggere, tuttavia quando lo ho modificato per leggere l'intero file in una sola volta in memoria, quindi passare un oggetto StringIO alla libreria PDF, il tempo di esecuzione del mio script è stato dimezzato.

  2. Stampa differita. Lo stesso script stampa un'intestazione prima di ogni PDF che legge. Tuttavia, posso specificare sulla riga di comando se ignorare determinati test che si trovano nel suo file di configurazione, o includerne solo alcuni. Se ignoro tutti i test per un determinato PDF, non voglio che l'intestazione sia stampata, ma non saprò quanti test ho eseguito fino a quando non avrò finito di eseguire i test (i test possono essere definiti anche dinamicamente). Quindi catturo l'intestazione in un oggetto StringIO cambiando sys.stdout in modo che punti ad esso, e ogni volta che eseguo un test, controllo se l'oggetto contiene qualcosa. Se è così, lo stampo e lo ripristino per svuotarlo. Voila, solo i PDF con test hanno le intestazioni stampate.

7

ho appena usato StringIO, in pratica, per due cose:

  • Per unit-test uno script che fa un sacco di print ING, reindirizzando sys.stdout a un'istanza StringIO per l'analisi semplice;
  • Per creare un documento XML ben formato garantito (una richiesta API personalizzata) utilizzando ElementTree e quindi write per l'invio tramite una connessione HTTP.

Non che è necessario StringIOspesso, ma a volte è molto utile.

0

Django ha una funzione call_command che viene utilizzato per richiamare comandi di gestione. Questa funzione stampa l'output su stdout e non restituisce alcun valore. Se vuoi sapere se il comando è stato eseguito correttamente o meno, devi esaminare l'output e decidere.

Utilizzando StringIO, è possibile catturare l'uscita e verificare se si desidera l'uscita o meno.

with io.StringIO() as output: 
    call_command('custom_command', stdout=output) 
    if 'Success' not in output.getvalue(): 
     print('Custom command failed...') 
Problemi correlati