I files

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.

Input/Output da terminale

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. Questo ha creato innumerevoli problemi, dovendo, in tutti i vecchi programmi, inserire le parentesi in un sacco di posti, modificando comandi tipo: "print a" in "print(a)".

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====

Uso di files

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.

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.