2012-03-22 15 views
16

Scrivo un sacco di codice Python in cui voglio solo leggere un file in una variabile. So che i due modi consigliati sono:È aperto(). Read() sicuro?

with open('file') as f: 
    data = f.read() 

# or 

fo = open('file') 
data = f.read() 
fo.close() 

Le mie domande, quali sono gli aspetti negativi di questo?

data = open('file').read() 
+1

Intendi "Quali sono gli svantaggi di non chiudere esplicitamente il file?" –

+0

@Will, sorta. La mia domanda riguarda lo specifico codice. Pensi che dovrei cambiare il titolo? – FakeRainBrigand

+5

Si noti che l'opzione '' with'' è superiore a causa del fatto che gestisce anche le eccezioni correttamente. –

risposta

19

Il lato negativo di

data = open('file').read() 

è che a seconda dell'implementazione Python, la pulizia dell'oggetto file aperto può o non può accadere subito. Ciò significa che il file rimarrà aperto, consumando un handle di file. Questo probabilmente non è un problema per un singolo file, ma in un loop potrebbe certamente essere un problema.

In termini specifici, CPython (la solita implementazione Python) utilizza oggetti conteggio di riferimento in modo che la chiusura del file quasi certamente corrisponderà immediatamente a. Tuttavia, questo non è necessariamente vero per altre implementazioni come IronPython o Jython.

+0

Grazie per la spiegazione :) – FakeRainBrigand

5

Lo svantaggio è che dopo che entrambi, il primo e il secondo blocco si può essere sicuri che il file sia chiuso. (In primo luogo, anche nel caso in cui sia stata sollevata un'eccezione.)

Il modulo breve non offre alcuna garanzia.

2

Secondo an answer in un similiar question (questa volta, per quanto riguarda le scritture), lo svantaggio principale è che non si ha alcun controllo su quando quel file verrà chiuso. Il problema è più significativo per le scritture (dal momento che stai modificando il file), ma significa comunque che hai un handle di file non chiuso finché l'oggetto non viene recuperato dal garbage collector.

Molti modelli generazionali cancelleranno questo tipo di oggetti (creati in un ambito, senza riferimenti rimanenti alla fine dello scope) subito, ma non possono essere garantiti. Quindi, è meglio attenersi alla chiusura esplicita dei file per essere sicuri.