You are here: Partenza > Dive Into Python > Una struttura orientata agli oggetti > Oggetti file | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Python ha una funzione built-in, open, per aprire un file su disco. open ritorna un oggetto di tipo file, che dispone di metodi e attributi per ottenere informazioni sul file aperto e manipolarlo.
>>> f = open("/music/_singles/kairo.mp3", "rb") >>> f <open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> >>> f.mode 'rb' >>> f.name '/music/_singles/kairo.mp3'
Il metodo open può prendere fino a tre parametri: il nome del file, una modalità di apertura e una dimensione di buffer. Solo il primo, il nome, è obbligatorio; gli altri due sono opzionali. Se non è specificato, il file è aperto per la lettura in modo testo. In questo esempio apriamo il file per la lettura in binario (print open.__doc__ visualizza la spiegazione completa di tutte le modalità possibili). | |
La funzione open ritorna un oggetto (a questo punto non dovrebbe più essere una sorpresa per voi). Un oggetto file ha molti utili attributi. | |
L'attributo mode di un oggetto file ritorna la modalità di apertura del file. | |
L'attributo name di un oggetto file ritorna il nome del file con cui è stato aperto. |
>>> f <open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> >>> f.tell() 0 >>> f.seek(-128, 2) >>> f.tell() 7542909 >>> tagData = f.read(128) >>> tagData 'TAGKAIRO****THE BEST GOA ***DJ MARY-JANE*** Rave Mix 2000http://mp3.com/DJMARYJANE \037' >>> f.tell() 7543037
>>> f <open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> >>> f.closed 0 >>> f.close() >>> f <closed file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> >>> f.closed 1 >>> f.seek(0) Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: I/O operation on closed file >>> f.tell() Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: I/O operation on closed file >>> f.read() Traceback (innermost last): File "<interactive input>", line 1, in ? ValueError: I/O operation on closed file >>> f.close()
L'attributo closed di un oggetto file indica se l'oggetto ha un file aperto oppure no. In questo caso, il file è ancora aperto (closed vale 0). I file aperti consumano risorse di sistema e a seconda della modalità di apertura, gli altri programmi potrebbero non essere in grado di accedervi. È importante chiudere i file appena avete finito di usarli. | |
Per chiudere un file, chiamate il metodo close dell'oggetto file. Questo metodo libera il lock (se presente) che state tenendo sul file, svuota i buffer di scrittura (se presenti) che il sistema non ha ancora scritto su disco e rilascia le risorse di sistema. L'attributo closed conferma che il file è stato chiuso. | |
Solo perché il file è stato chiuso, non significa che l'oggetto file non esista più. La variabile f continua ad esistere finché non esce dallo scope corrente o è cancellata manualmente. In ogni caso, nessuno dei metodi che manipolano un file funzionerà una volta che il file è stato chiuso, ma solleveranno un'eccezione. | |
Chiamare close su un oggetto il cui file è già stato chiuso non genera un'eccezione; fallisce silenziosamente. |
try: fsock = open(filename, "rb", 0) try: fsock.seek(-128, 2) tagdata = fsock.read(128) finally: fsock.close() . . . except IOError: pass
Poiché aprire e leggere un file è un'operazione che potrebbe generare un'eccezione, tutto il codice è racchiuso in un blocco try...except (e qui dovreste cominciare ad apprezzare le indentazioni standard di Python...). | |
La funzione open può generare un IOError (forse il file non esiste). | |
Il metodo seek può generare un IOError (forse il file è più piccolo di 128 byte). | |
Il metodo read può generare un IOError (forse il disco ha un settore illeggibile, o è un disco di rete e la rete non è disponibile). | |
Questo è nuovo: un blocco try...finally. Una volta che il file è stato aperto con successo dalla funzione open, vogliamo essere assolutamente sicuri che lo chiuderemo, anche se venisse generata un'eccezione dai metodi seek o read. A questo serve il blocco try...finally: il codice nel blocco finally verrà sempre eseguito, anche se qualcosa nel blocco try generasse un'eccezione. Pensate al blocco finally come a codice che viene eseguito “all'uscita”, indipendentemente da ciò che è successo prima. | |
Infine, gestiamo la nostra eccezione IOError che potrebbe essere generata dalla chiamata a open, seek, o read. Qui non fa differenza, perché ci limitiamo ad ignorarla e continuare. Ricordate, pass è un comando Python che non fa nulla. Questo è perfettamente lecito; “gestire” un'eccezione può significare esplicitamente non fare nulla. L'eccezione verrà comunque considerata gestita e il programma continuerà normalmente con la riga di codice successiva al blocco try...except. |
<< Gestire le eccezioni |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
Cicli for >> |