In python3 i files sono tipi, l'apertura di un file crea un oggetto 'file' e gli assegna un riferimento. Ci sono diverse funzioni per trattare i files, soprattutto rivolte a files di testo. Per i files di testo la codifica e decodifica UTF-8 dei caratteri e' effettuata dal Python in modo trasparente all'utente. Di default i files sono intesi come files di testo.
Ad un programma Python, anche nell'esecuzione interattiva, sono associati uno "standard" output ed uno "standard" input, da cui il programma legge e scrive di default.
Per scrivere sullo standard output si usa la funzione "print". In Python 2 "print" invece di una funzione era un comando.
La funzione print ha un numero arbitrario argomenti e li stampa , trasformati in stringhe con la funzione str, separati da uno spazio. Ogni comando print stampa una sola linea, a meno che le stringhe stampate non abbiano dentro il carattere: "\n" , che viene interpretato come un fine linea. Assieme a "print" viene in genere usato l'operatore di formattazione, per scrivere stringhe entro cui si inseriscono numeri e caratteri definiti a run-time.
La lettura da terminale si puo' fare, in Python 3, con la funzione "input", che legge una linea e la mette in una stringa. La funzione input puo' avere come argomento un "prompt" che viene stampato prima della lettura. In Python 2 la funzione analoga e' "raw_input", mentre "input" esegue la funzione eval su una stringa che legge.
Esempi:
print(a,b) : scrive 2 variabili separate da uno spazio print("%s xxxx %s" % (a,b)) : scrive a e b separati da xxxx a=input("=> ") : legge una linea e la mette nella stringa "a" prima di leggere stampa: "=> "
La funzione "print" di Python3 ha diversi argomenti opzionali e la sua sintassi completa e':
print([object, ...][, sep=' '][, end='\n'][, file=sys.stdout]) sep : stringa di separazione fra le variabili stampate end : carattere di fine linea a fine stampa file : riferimento al file su cui si stampa
Esempio, che stampa un valore per riga e dopo l'ultimo scrive: "===="
print("a","b","c",sep="\n",end="====\n") a b c====
Per accedere ad un file si usa la funzione "open", che crea un oggetto file e ritorna un riferimento ad esso. L'oggetto file ha funzioni per accedere al contenuto del file. Ci sono anche funzioni per leggere il file tutto in una volta e metterne il contenuto in una stringa, e funzioni per farne una lista di stringhe con le singole linee.
L'output e' befferizzato, cioe' non scritto subito sul file, ma posto un un'area di memoria apposita (buffer) e scaricato sul file, tutto insieme, in un secondo momento, per ottimizzare i tempi di calcolo. La funzione "flush" scarica il buffer subito.
Il file ha un puntatore che ricorda dove si e' arrivati nella lettura, che, a diversi comandi di lettura, si sposta in avanti nel file. La funzione seek sposta il puntatore, permettendo di saltare parti del file o di rileggere contenuti gia' letti.
Il file viene chiuso con la funzione "close", che elimina il riferimento al file.
La sintassi completa della funzione open e':
open(nome_file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) mode e' il modo do accesso: 'r' : per lettura di testo 'w' : per scrivere testo 'a' : aggiunge testo a fine file '+' : sia lettura che scrittura 'b' : file con dati binari, ove NON si interpretano i caratteri come codifiche UTF-8 I caratteri possono essere combinati, ad esempio 'wb' ed 'rb' per scrivere o leggere dati binari. Gli altri parametri sono raramete usati: buffering : da indicazioni sull'uso e dimensione del buffer newline : indicazioni sul carattere di fine linea errors : su come gestire errori di codifica closefd : gestisce chiusura del file encoding: il tipo di codifica per i caratteri: Python prevede parecchie codifiche oltre UTF_8: ascii, latin-1, cyrillic, greek, UTF_16, UTF_32. In genere assume la codifica di default del computer che si sta usando.
Esempi e funzioni per i files:
f= open('filetest','w') : apre un file di nome filetest per scriverci. e crea un oggetto f, di tipo "file" f1=open('filetest2','r') : apre un file di nome filetest per leggerlo f2=open('filetest3','r+'): per leggere e scrivere f3=open('filetest4','a') : per aggiungere in fondo al file f,f1 etc. sono riferimenti ai files, che sono oggetti. filetest, filetest2 etc. sono i nomi dei files. stringa1=f1.readline() : legge una linea dal file f1 e la mette in stringa1 stringa2=f1.read() : mette in stringa2 tutto il file f1 stringa2=f1.read(10) : mette in stringa2 10 byte del file f1 stringhe=f1.readlines() : legge tutto il file e ne fa una lista ogni elemento della lista e' una linea del file f.writelines(stringhe) : scrive, di seguito, le stringhe della lista. Per essere scritte su diverse linee le stringhe devono finire con: "\n" f.write('stringa') : scrive sul file una stringa f.write('stringa\n') : scrive sul file una linea (\n e' il carattere di fine linea) f.flush() : svuota il buffer, scrivendolo tutto sul file f.seek(5) : si posiziona al sesto byte del file ( i bytes si contano a partire da 0) f.tell() : dice a che byte e' posizionato il file f.truncate(m) : tronca il file dopo m bytes f.close() : chiude il file. L'oggetto 'f' viene distrutto f.name : contiene il nome del file f.mode : stringa che specifica il modo di accesso: 'r','w' etc. data = open('data.bin', 'rb').read() : lettura file binario, messo in 'data' come insieme di bytes ad esempio: b'bbbbcccc\ndddd\n'
Ci sono sistemi per iterare sulle linee del file, in modo da elaborarne una riga per volta; ed i files possono essere usati in list comprehension per creare liste:
Esempi:
for line in open('data.txt'): print(line) lines = [line.rstrip() for line in open('script2.py')] lines= [ line.split() for line in open('script2.py')] In quest'ultimo esempio si fa una lista di liste ove si separano le parole di ogni linea, che vengono a costituire una lista.