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.