2009-12-10 13 views
9

Sono abituato al C++ e costruisco le mie classi/funzioni per la gestione dei dati per gestire gli oggetti stream anziché i file. Mi piacerebbe sapere come posso modificare il seguente codice, in modo che possa gestire un flusso di dati binari in memoria, piuttosto che un handle di file.Utilizzando Python, come faccio a leggere/scrivere i dati in memoria come farei con un file?

def get_count(self): 
    curr = self.file.tell() 
    self.file.seek(0, 0) 
    count, = struct.unpack('I', self.file.read(c_uint32_size)) 
    self.file.seek(curr, 0) 
    return count 

In questo caso, il codice presuppone self.file è un file, aperto in questo modo:

file = open('somefile.data, 'r+b') 

Come potrei usare lo stesso codice, ma invece fare qualcosa di simile:

file = get_binary_data() 

Dove get_binary_data() restituisce una stringa di dati binari. Sebbene il codice non lo mostri, devo anche scrivere sullo stream (non pensavo che valesse la pena pubblicare il codice per questo).

Inoltre, se possibile, mi piacerebbe che il nuovo codice gestisse anche i file.

risposta

16

È possibile utilizzare un'istanza di StringIO.StringIO (o cStringIO.StringIO, più veloce) per fornire un'interfaccia simile a file ai dati in memoria.

+1

_Il link qui sopra menzionato non funziona perché ("StringIO e cStringIO" sono ormai passati in Python 3.0. Essi esistono solo nella versione 2.0. IO li ha sostituito in 3.0 ") _ Ci scusiamo per questo commento, ma sembra una tradizione per questa risposta ... – tampe125

5

Dai un'occhiata alla 'StringIO' (lettura e scrittura stringhe come file)

+0

il collegamento sopra menzionato non funziona perché (" StringIO e cStringIO "sono ora disponibili in Python 3.0. Esistono solo in 2.0. li in 3.0 "). – Bhavana

5

Usa StringIO.

+0

il collegamento sopra menzionato non funziona perché ("StringIO e cStringIO" sono ora disponibili in Python 3.0. Esistono solo in 2.0 io li ha sostituiti in 3.0 "). – Bhavana

6

Dai un'occhiata al modulo StringIO di Python, docs here, che potrebbe essere più o meno quello che stai cercando.

+0

il collegamento sopra menzionato non funziona perché (" StringIO e cStringIO "sono ora disponibili in Python 3.0, esistono solo in 2.0 e io li ho sostituiti in 3.0"). – Bhavana

1

Mi piace il tempo della risposta. (eccetto il mio)

Possiamo vedere il tempo di risposta in millisecondi?

di portate StringIO

Problemi correlati