2013-08-31 3 views
37

Così, per la creazione di file Io uso il seguente:Come eseguire l'elaborazione dei file virtuali?

fileHandle = open('fileName', 'w') 

quindi scrivere il contenuto del file, chiudere il file. Nel passaggio successivo elaboro il file. Alla fine del programma, ho finito con un "file fisico" che ho bisogno di cancellare.

C'è un modo per scrivere un file "virtuale" che si comporti esattamente come uno "fisico" (permettendogli di essere manipolato allo stesso modo) ma non esiste alla fine dell'esecuzione in Python?

risposta

40

Si potrebbe prendere in considerazione l'utilizzo di uno tempfile.SpooledTemporaryFile che offre il meglio di entrambi i mondi nel senso che inizialmente creerà un file virtuale temporaneo basato sulla memoria ma passerà automaticamente a un file fisico basato su disco se i dati contenuti in memoria supera una dimensione specificata.

Un'altra caratteristica interessante è che (quando si usa la memoria) userà in automatico l'io.BytesIO o io.StringIO a seconda di cosa mode viene utilizzato-la quale consente di leggere e scrivere stringhe Unicode o dati binari (byte) ad esso.

L'unica parte difficile potrebbe essere il fatto che è necessario evitare di chiudere il file tra una procedura e l'altra poiché ciò causerebbe l'eliminazione dalla memoria o dal disco. Invece puoi semplicemente riavvolgerlo dall'inizio con una chiamata al metodo di file seek(0).

Quando il file è completamente chiuso e chiuso, verrà automaticamente eliminato dal disco se la quantità di dati in esso contenuta ha causato il roll-over su un file fisico.

+0

Esempi rilevanti: https://stackoverflow.com/questions/8577137/creating-a-tmp-file-in-python –

41

Hai StringIO e BytesIO nel modulo io.

StringIO si comporta come un file aperto in modalità testo - la lettura e la scrittura di stringhe Unicode (equivale ad aprire un file con io.open(filename, mode, encoding='...')), e le BytesIO si comporta come un file aperto in modalità binaria (mode='[rw]b'), e in grado di leggere i byte di scrittura.

Python 2:

In [4]: f = io.BytesIO('test') 
In [5]: type(f.read()) 
Out[5]: str 
In [6]: f = io.StringIO(u'test') 
In [7]: type(f.read()) 
Out[7]: unicode 

Python 3:

In [2]: f = io.BytesIO(b'test') 
In [3]: type(f.read()) 
Out[3]: builtins.bytes 
In [4]: f = io.StringIO('test') 
In [5]: type(f.read()) 
Out[5]: builtins.str 
+8

Occorre notare che se è necessario interfacciarsi con il codice che richiede nomi di file, quindi: [Se tutto il codice legacy può richiedere un nome file, l'istanza di 'StringIO' non è la strada da percorrere. Usa invece il modulo 'tempfile' per generare un nome file temporaneo.] (Http: // stackoverflow.it/questions/11892623/python-stringio-and-compatibility-with-statement-context-manager/11892712 # 11892712) – sdaau

8

È possibile utilizzare StringIO come un file virtuale, da Official documentation

import StringIO 

output = StringIO.StringIO() 
output.write('First line.\n') 
print >>output, 'Second line.' 

# Retrieve file contents -- this will be 
# 'First line.\nSecond line.\n' 
contents = output.getvalue() 

# Close object and discard memory buffer -- 
# .getvalue() will now raise an exception. 
output.close() 
+7

Ricorda, se vuoi passarlo a un'altra funzione, come un oggetto simile a un file, dovresti riavvolgi il file virtuale con: output.seek (0) – RufusVS

+0

man, stai copiando dalla documentazione ufficiale? :) Penso che sia giusto usare un link in questi casi. – maxadamo

+0

@maxadamo Fatto. Grazie. –

0

C'è il modulo StringIO, leggi its documentation, dovrebbe essere facile da usare.

Tenere presente, tuttavia, che ciò manterrebbe il contenuto del "file" in memoria. Se hai troppi dati, probabilmente sarebbe meglio creare un file reale, ad es. in/tmp, e cancellarlo in seguito.