Differenza nell'apertura file con e senza "with"

L
Leop (450 points)
2 8 14
asked Nov 1, 2017 in Programmare in Python by Leop (450 points)
closed Nov 1, 2017 by andrea.sterbini

Ciao a tutti, primo post.

Volevo sapere che differenza c'è tra l'aprire un file con "with open(file) as x" e l'aprirlo dichiarandolo come variabile usando "x = open(file)".

Ho notato che i metodi si possono usare in entrambi i modi, quindi, effettivamente, cosa cambia?

280 views
closed with note: answered

5 Answers

francesco.dev (33560 points)
14 51 129
answered Nov 1, 2017 by francesco.dev (33,560 points)
edited Nov 1, 2017 by francesco.dev

Ciao!

A livello intuitivo sinceramente penso si tratti della stessa cosa, l'unica differenza è che usando with open(...) as... abbiamo un'indentazione molto più ordinata e ricorda che usiamo tale metodo per poter scrivere direttamente delle informazioni sul file. Quindi lo usiamo quando a priori conosciamo ciò che dobbiamo scrivere o leggere, visto che usando tale sintassi poi andremo a scrivere all'interno di essa come se fosse (banalmente) un if o qualsiasi costrutto di questo genere, ovvero diciamo "all'apertura del file: fai questo".
Invece usiamo l'assegnazione ad una variabile x l'apertura del file quando vogliamo applicare delle modifiche alla variabile x solo dopo altre istruzioni.

Esempio:
Nell'esercizio 2 del secondo homework ti conviene usare with open()... perché sai già cosa dovrai scrivere sul file, invece se avevi bisogno di attuare delle operazioni prima di scrivere su di esso (come ad esempio: leggere il file, trovare una parola data in input e, dopo averla trovata, scriverla alla fine del file stesso) sarebbe stato molto più comodo l'uso di una variabile di appoggio che contiene l'intero file.

Infine ricorda che con l'assegnazione ad una variabile il contenuto del file sarai costretto ad usare il metodo close() per chiuderlo.

Sperando di essere stato chiaro,
- Francesco Pio Scognamiglio

Jury Francia (7520 points)
18 76 100
answered Nov 1, 2017 by Jury Francia (7,520 points)
Se lo apri senza usare with devi chiudere il file quando hai terminato di usarlo con close(), with invece lo fa automaticamente
A
Alessio.Luc (3920 points)
5 16 25
answered Nov 1, 2017 by Alessio.Luc (3,920 points)
Ciao,

la differenza sostanziale tra i due modi di aprire un file si trova nel fatto che, con un semplice “f=open(...)” il file avrà bisogno di essere chiuso con un “f.close()” prima della fine del programma; invece con il “with open(file) as ...” il file si chiuderà da solo al termine del blocco.

In termini di efficienza le due espressioni dovrebbero essere indifferenti.
LeonardoEmili (35740 points)
11 65 155
answered Nov 1, 2017 by LeonardoEmili (35,740 points)

Ciao!

La differenza oltre nella sintassi sta anche in come questi due comandi le operazioni. Perché se è vero che sia variabile = open() e with open() as variabile, vengono utilizzate per interagire con i file, leggerli, scrivere, sovrascrivere, appendere etc.. (non mi dilungherò su questo argomento poichè in una discussione precedente questo argomento è stato già trattato in maniera eccellente) , il secondo caso sebbene sintatticamente più elaborato gestisce anche eccezioni ed errori. Infatti nell'ipotesi in cui ti si venga a creare un errore nell'apertura di un file potresti incappare in un problema perché tale funzione non riesce a gestirlo, invece il costrutto with open() as oltre a chiudere automaticamente il file ne gestisce anche i comportamenti anomali.

Pertanto è fortemente consigliato l'utilizzo del with open() as file.

Spero di aver chiarito ogni tuo dubbio, 

ti auguro una buona giornata.

Leonardo Emili

EDIT: ti linko i post di cui ti parlavo in merito all'apertura file:

http://q2a.di.uniroma1.it/283/modalita-usate-per-i-file?show=291#a291

http://q2a.di.uniroma1.it/131/funzione-open?show=131#q131

answered Nov 1, 2017 by Anon1 (9,920 points)

Ciao, una cosa che non è stata specificata dai colleghi è che il costrutto with aumenta la complessità ciclomatica, perchè gestisce le eccezioni (come il blocco try/except). Ricordati di questo particolare quando vedrai il risultato del test!

LeonardoEmili (35740 points)
11 65 155
commented Nov 1, 2017 by LeonardoEmili (35,740 points)
Perfetto, mi ero scordato di inserirlo !! Ottima osservazione