Input/Output e file

I nostri programmi sarebbero di scarsa utilità se non fossero in grado di interagire con l’utente. Nei capitoli precedenti abbiamo visto, di passaggio, l’uso della la parola chiave di print per visualizzare i messaggi sullo schermo.
In questo capitolo, oltre a descrivere ulteriormente l’uso di print per visualizzare i messaggi all’utente, vedremo come utilizzare le funzioni di input e raw_input per chiedere informazioni, così come gli argomenti della riga di comando, e infine, l’input/output dei file.
Input standard
Il modo più semplice per ottenere informazioni da parte dell’utente e attraverso la funzione raw_input. Questa funzione prende come parametro una stringa da utilizzare come prompt (cioè, come testo da mostrare all’utente chiedendo l’ingresso) e restituisce una stringa con i caratteri inseriti dall’utente prima di premere il tasto Invio. Vediamo un piccolo esempio:
			nome = raw_input("Come ti chiami? ")
			print "È un onore, " + nome
Se abbiamo bisogno di un numero intero come input invece di una stringa, per esempio, potremmo utilizzare la funzione int per convertire la stringa in un intero, anche se sarebbe opportuno tenere conto del fatto che si può generare un’eccezione se l’utente non inserisce un numero.
			try:
			    eta = raw_input("Quanti anni hai? ")
			    giorni = int(eta) * 365
			    print "Hai vissuto " + str(giorni) + " giorni"
			except ValueError:
			    print "Questo non è un numero"
La funzione input è un po’ più complicata. Ciò che fa questa funzione è quella di usare raw_input per leggere una stringa dallo standard input, e poi procede a valutarla come se si trattasse di codice Python, per questo motivo input dovrebbe essere trattato con attenzione.
Parametri sulla riga di comando
Oltre all’utilizzo di input e raw_input il programmatore Python ha altri metodi per ottenere i dati dall’utente. Uno di loro è l’uso di parametri quando si chiama il programma sulla riga di comando. Ad esempio:
			python editore.py ciao.txt
In questo caso, ciao.txt sarebbe il parametro, che può essere accessibile attraverso la lista sys.argv, anche se, come ci si potrebbe aspettare, prima di utilizzare questa variabile si deve importare il modulo sys. sys.argv[0] contiene sempre il nome del programma tale come l’utente l’ha eseguito, sys.argv[1], s’eventualmente esiste, sarebbe il primo parametro, sys.argv[2] il secondo, e così via.
			import sys
			if(len(sys.argv) > 1):
			    print "Aprendo " + sys.argv[1]
			else:
			    print "È necessario indicare il nome del file"
Esistono moduli come optparse, che rende facile il lavoro con gli argomenti della riga di comando, ma spiegare il suo utilizzo va oltre gli scopi di questo capitolo.
Output standard
Il modo più semplice per mostrare qualcosa sullo standard output è quello di utilizzare l’istruzione print, come abbiamo visto molte volte negli esempi precedenti. Nella sua forma più elementare scrivendo la parola chiave print seguito da una stringa, si visualizzerà sullo standard output quando si eseguire il codice.
			>>> print "Ciao Mondo"
			Ciao Mondo
			>>> 
Dopo aver stampato la stringa passata come parametro il puntatore rimane sulla riga successiva dello schermo; il print di Python funziona come il println di Java.
In alcune funzioni equivalenti di altri linguaggi di programmazione è necessario aggiungere un carattere di nuova riga per indicare esplicitamente che vogliamo spostarci alla riga successiva. Questo è il caso della funzione printf in C o la propria funzione print di Java.
Si è spiegato l’uso di questi caratteri speciali nel capitolo sui tipi di base di Python. L’istruzione seguente, ad esempio, stampa la parola “Ciao“, seguita da una riga vuota (due newline, ‘\n‘), e la parola “Mondo” identata (con il carattere di tabulazione, ‘\t‘).
			>>> print "Ciao\n\n\tMondo"
			Ciao

				Mondo
			>>> 
Per far sì che la successiva stampa si mostri sulla stessa linea si dovrebbe mettere una virgola alla fine della sentenza. Confrontare il risultato di questo codice …
			>>> for i in range(3):
print i,
			0 1 2
			>>>
… con quest’altro, che non utilizza la virgola alla fine della sentenza:
			>>> for i in range(3):
print i
			0
			1
			2
			>>>
Questo meccanismo di collocare una virgola alla fine della sentenza funziona perché è il simbolo che si utilzza per separare le catene che desideriamo stampare sulla stessa riga.
			>>> print "Ciao", "Mondo"
			Ciao Mondo
			>>>
Questo differisce dall’uso dell’operatore + per concatenare stringhe perché all’utilizzo delle virgole, print inserisce automaticamente uno spazio per separare ciascuna delle stringhe. Questo non è il caso quando si usa l’operatore +, in quanto ciò che arriva a print è un solo argomento: una stringa già concatenata.
			>>> print "Ciao" + "Mondo"
			CiaoMondo
			>>>
Inoltre, utilizzando l’operatore + dobbiamo convertire prima ogni argomento in una stringa se non è già una stringa, in quanto non è possibile concatenare stringhe e altri tipi, mentre utilizzando il primo metodo non è necessaria la conversione.
			>>> print "Costa", 3, "euro"
			Costa 3 euro
			>>> print "Costa" + 3 + "euro"
			<type ‘exceptions.TypeError’>: cannot concatenate ‘str’ and ‘int’ objects
La sentenza print, o meglio le stringhe che stampa, permettono anche di usare la formatazione avanzata, simile allo sprintf di C. Consideriamo un esempio abbastanza semplice:
			print "Ciao %s" % "Mondo"
			print "%s %s" % ("Ciao", "Mondo")
Ciò che fa’la prima riga è inserire i valori a destra del simbolo % (la stringa “Mondo”) nelle posizioni indicate dagli indicatori di conversione della stringa a sinistra del simbolo %, dopo la conversione al tipo appropriato.
Nella seconda riga, vediamo come si può passare più di un valore da sostituire, attraverso una tupla.
In questo esempio abbiamo un solo indicatore di conversione: %s.
Gli specificatori più semplici sono formate dal simbolo % seguito da una lettera che indica il tipo con cui formattare il valore, ad esempio:

Specificatore Formato
%s Stringa
%d Intero
%o Ottale
%x Esadecimale
%f Reale

È possibile immettere un numero tra % e il carattere che indica il tipo di formattazione, indicando il numero minimo di caratteri che desideriamo occupare nella catena. Se la dimensione della stringa risultante è inferiore a questo numero, vengono aggiunti spazi a sinistra della stringa. Nel caso in cui il numero è negativo, si verificherà esattamente lo stesso, solo che gli spazi vengono aggiunti alla destra della stringa.

			>>> print "%10s Mondo" % "Ciao"
			      Ciao Mondo
			>>> print "%-10s Mondo" % "Ciao"
			Ciao       Mondo
			>>> 
Nel caso di numeri reali si può indicare la precisione con la f precedendolo da un punto (periodo) seguito dal numero di cifre decimali che si desidera visualizzare:
			>>> from math import pi
			>>> print "%.4f" % pi
			3.1416
			>>> 
La stessa sintassi può essere usata per indicare il numero di caratteri della stringa che vogliamo mostrare:
			>>> print "%.4s" % "Ciao Mondo"
			Ciao
Records
I files in Python sono oggetti di tipo file creati utilizzando il metodo open (aprire). Questa funzione prende come parametri una stringa contenente il percorso del file da aprire, che può essere relativo o assoluto; una stringa opzionale indica la modalità di accesso (se non specificato si accede in modalità lettura) e, infine, un intero opzionale specifica una dimensione del buffer diversa da quella utilizzata per impostazione predefinita.
Standard PHP Library
La modalità di accesso può essere una qualsiasi combinazione logica dei seguenti modi:

  • ‘r’: read, legge. Apre il file in modalità lettura. Il file deve già esistere, altrimenti viene generata un’eccezione di tipo IOError.
  • ‘w’: write, scrive. Apre il file in modalità di scrittura. Se il file non esiste viene creato. Se esiste, sovrascrive il contenuto.
  • ‘a’: append, aggiunge. Apre il file in modalità di scrittura. Si differenzia dal modo ‘w’ perché in questo caso non sovrascrive il contenuto del file, ma comincia a scrivere alla fine del file.
  • ‘b’: binary, binario.
  • ‘+’: permette letture e scritture simultanee.
  • ‘U’: universal newline, interruzioni di riga universali. Può funzionare con dei files con un formato, per le interruzioni di riga, che non corrispondono alla corrente piattaforma (Windows utilizza il carattere CR LF, Unix utilizza LF e Mac OS CR).
				f = open("file.txt", "w")
Dopo aver creato l’oggetto che rappresenta il nostro file utilizzando la funzione open possiamo essere in grado di eseguire le operazioni di lettura/scrittura con i metodi adeguati dell’oggetto che vedremo nelle seguenti sezioni.
Una volta finito il lavoro sul file si dovrebbe chiudere utilizzando il metodo close.
Lettura di files
Per leggere i file si utilizzano i metodi read, readline e readlines.
Il metodo read restituisce una stringa con il contenuto del file o il contenuto dei primi n bytes, se si specifica la dimensione massima da leggere.
				completo = f.read()
				parte = f2.read(512)
Il metodo readline è utilizzato per leggere le righe dal file uno per uno. Cioè, ogni volta che si chiama questo metodo restituisce il contenuto del file dal puntatore finché non trova un carattere di nuova riga, compreso questo carattere.
				while True:
				    linea = f.readline()
				    if not linea: break
				    print linea
Infine, readlines, funziona leggendo ogni riga del file e restituisce un elenco con le linee lette.
Scrittura di files
Per la scrittura di file si utilizzano il metodo write e writelines. Mentre il primo opera scrivendo nel file in una stringa di testo che prende come parametro, il secondo prende come parametro una lista di stringhe indicando le linee che si desidera scrivere nel file.
Spostare il puntatore di lettura/scrittura
Ci sono situazioni in cui potremmo voler spostare il puntatore di lettura/scrittura ad una particolare posizione del file. Per esempio, se si inizia a scrivere in una certa posizione e non alla fine o all’inizio del file.
Per questo si utilizza il metodo seek che prende come parametro un numero positivo o negativo da utilizzare per lo spostamento. È inoltre possibile utilizzare un secondo parametro per indicare da dove vogliamo fare lo spostamento: 0 indica che lo spostamento si riferisce all’inizio del file (comportamento di default), 1 si riferisce alla posizione corrente e 2 alla fine del file.
Per determinare la posizione in cui si trova il puntatore viene utilizzando il metodo tell(), che restituisce un intero che indica la distanza in bytes dall’inizio del file.


Similari
Overloading di metodi in Java
12% Java
Un metodo overload viene utilizzato per riutilizzare il nome di un metodo ma con argomenti diversi, opzionalmente con un differente tipo di ritorno. [expand title=”Regole per overload” startwrap=”” endwrap=”” excerpt=”⤽” s…
Modi di fare e di non fare in Python
11% Python
Questo documento può essere considerato un compagno del tutorial di Python. Viene illustrato come utilizzare Python, e quasi ancora più importante, come non usare Python. [expand title=”Costrutti del linguaggio che non dov…
redirect 301 usando mod_alias
9% Server
mod_alias è fondamentalmente la versione più semplice di mod_rewrite. Non può fare le cose che fa mod_rewrite, ad esempio modificare la stringa di query. Per eseguire reindirizzamenti nel server web Apache è possibile di u…
Installare Python e Django su Windows
8% Django
Quando ci riferiamo allo sviluppo web con Python, la prima cosa che viene in mente è usare un qualche framework. Il più famoso e utilizzato da tutti è il Django, ma non è l’unico. Ci sono Pylons, Grok, TurboGears e Zope: t…
Metodi magici e costanti predefinite in PHP
8% Php
PHP fornisce un insieme di costanti predefinite e metodi magici per i nostri programmi. A differenza delle normali costanti i quali si impostano con define(), il valore delle costanti predefinite o speciali dipendono da do…