Python, gestione files
Autore:[Antonio Gallonetto]
Python ci permette di interagire in modo molto facile per creare, leggere e modificare i nostri files, in questo modo possiamo interagire con i nostri archivi senza alcun problema utilizzando python.
La funzione open()
La funzione open ci permette di aprire un canale di comunicazione con il nostro archivio, se l’archivio non esiste lo crea.
Forma Semplice della funzione open()
descrittoreFile=open('NomeFile', 'modoDiApertura')
operazioni sul file
descrittoreFile.close()
Nel caso non si indichi il modo di apertura quello standard è di sola lettura e solo testo.
La funzione restituisce un descrittore del file, è un po’ come avere un’etichetta con la quale indicare il canale di comunicazione tra il nostro software e il file che si trova sulla memoria di massa.
Il canale di comunicazione quando abbiamo terminato l’utilizzo deve essere chiuso, descrittoreFile.close(). Questo procede con la scrittura dei dati sul dispositivo e la rimozione del puntatore al file.
Nel caso nel quale il descrittore del file venga associato ad un altro file, prima viene chiuso automaticamente e poi riaperto associandolo al nuovo file.
Modo di apertura del file
Esistono vari modi per aprire questo canale di comunicazione:
- r significa read only, in sola lettura ed è il modo predefinito di apertura, nel caso non sia indicato lo apre in sola lettura
- w significa write, il file è aperto in scrittura, se il file esiste cancella il contenuto altrimenti lo crea ex-novo
- a significa append, il nuovo contenuto è aggiunto alla fine del file
- x significa exclusive, creazione del file in modo esclusivo, la condizione è che il file non esista già, nel caso sia già presente restituisce un errore
- r+ la modalità r+ apre il file in lettura e scrittura, e si posiziona all’inizio del file. La scrittura inizia dall’inizio e sovrascrive il contenuto precedente. Nel caso il file non sia presente genera un’errore FileNotFound.
- w+ la modalità w+ apre il file in lettura e scrittura, cancella il contenuto del file se è già presente. Nel caso il file non esista crea un nuovo file vuoto.
- a+ apre il file in lettura e scrittura si posiziona alla fine del file, non cancella il contenuto precedente. Nel caso il file non sia già presente lo crea.
- b il files sono aperti de default in modalità testo, è possibile aprirli in modalità binaria, ed è possibile combinare questa con quelle precedenti
Ulteriori parametri nell’apertura del file
Oltre al nome del file e al modo di apertura, abbiamo a disposizione i seguenti parametri opzionali:
- buffering
- encoding
- errors
- newline
- closefd
- opener
buffering
Il buffering, permette di indicare un valore numerico in bytes della dimensione di memoria dedicata per i dati da leggere e scrivere.
Un valore speciale è lo 0 che disattiva il buffer, ed è permesso solo nella modalità binary. Mentre applicabile ai soli file di testo è il valore 1 che indica una riga alla volta.
Questa funzionalità può essere utile quando l’applicazione riceve una grande quantità di dati, che nel caso di un buffer di default troppo piccolo potrebbe riempirlo completamente e i dati che arriverebbero successivamente andrebbero persi finchè il nostro contenitore non sarà nuovamente vuoto e quindi nuovamente riempibile. In questo caso un buffer più grande potrebbe essere particolarmente utile.
encoding
Per i caratteri di testo la codifica è particolarmente importante, una codifica troppo semplice come ad esempio quella ascii che utilizza solo 7 bit potrebbe essere poco rappresentativa dell’alfabeto che stiamo usando e in questo caso alcuni caratteri potrebbero non essere rappresentati come nel nostro caso quelli accentati.
La codifica è la mappa che permette di convertire un carattere in un numero comprensibile ad un calcolatore. Storicamente la codifica utilizzata è quella ascii a 7 bit, nella quale molti caratteri non trovano posto, la versione a 8 bit indicata come utf-8 è una codifica molto più rappresentativa.
La codifica standard nell’apertura dei files in python è utf-8 e quindi perfettamente rappresentativa per la lingua italiana.
La codifica in ogni caso è particolarmente utile indicarla esplicitamente, soprattutto nel caso nel quale cambino le specifiche dell’implementazione del linguaggio.
errors
Gestione degli errori nella lettura dei files disponibili:
‘strict’
genera un errore unicode (UnicodeError) quando non riesce a leggere un carattere, questo è il modo di defaultbackslashreplace
il carattere che non si riesce a leggere è rimpiazzato da un backslashignore
ignora i caratteri che non riesce a leggerenamereplace
il carattere non decodificabile è rimpiazzato dal suo nomereplace
il carattere non decodificabile è rimpiazzato da un punto esclamativoxmlcharrefreplace
il carattere non decoficabile è rimpiazzato da un carattere xml
Esempio utilizzando encoding e errors
Nell’esempio seguente andremo a scrivere in un file i caratteri accentati ò ù à con la codifica UTF-8, quindi in grado di rappresentarli e poi andremo a leggerli con una codifica ascii che non è in grado di rappresentarli, e i caratteri non rappresentati andiamo a sostituirli con un punto di domanda.
f = open('test.txt', "w",encoding='UTF-8') # apriamo il file in scrittura
f.write("o accentata ò -- u accentata ù -- a accentata à")
f.close()
f = open('test.txt', "r",encoding='ascii',errors="replace")
print(f.read())
f.close()
newline
In Windows, Macos e Linux la fine della riga e il ritorno a capo sono gestiti in maniera differente. I primi calcolatori utilizzavano le sequenze di codici ascii per pilotare le periferiche, ad esempio terminali a a caratteri, stampanti, ad esempio, per far terminare una pagina e mandare la stampante alla pagina successiva si inviava un codice di escape (27) seguito da un linefeed (10). Da questo deriva la diversa implementazione, di seguito le varie soluzioni nei vari sistemi perativi.
Gestione del ritorno a capo nei vari sistemi operativi:
- Windows CR+LF, il termine della riga è gestito da due caratteri, carridge return + line feed, codici ascii 13 + 10
- Linux, **Line Feed **(LF)
- MacOs X Line Feed (LF)
- MAcOs 9 e precedenti, carridge return
Gestione del ritorno a capo in python I possibili valori sono i seguenti:
newline=''
vengono interpretati tutti i possibili ritorno a capo,\n \r \r\n
newline='\n'
equivalente a line feed (ascii=10)newline='\r'
equivalente a carridge return (ascii=13)newline='\r\n'
equivalente a carridge return seguito da line feed (ascii=1310)
Di default python è impostato sulla stringa vuota quindi interpreta tutte le possibili soluzioni.
closefd
closefd è utilizzato quando si passa alla funzione open un descrittore di un file e si vuole che venga mantenuto aperto, in questo caso impostandolo a false.
opener
opener è una speciale funzione definita dall’utente, con la seguente forma opener(path, flags). In questo modo possiamo gestire come avviene l’apertura del file, ad esempio relativa alla posizione nella quale si trova l’applicazione, oppure con particolari flag.