2. snippets
2.1. Argomenti della Command Line
#!/usr/bin/env python # prg. cmdline01.py <nomeFile> # 18-04-2006 ByteMan OpenWeb # Uso della Command Line ed alterazione del contenuto di un file. import sys # Questo modulo consente l'uso del vettore predefinito sys.argv # sys.argv[0] contiene il nome della riga di avvio del programma # sys.argv[1] contiene il nome del primo argomento passato al programma def main(): if len(sys.argv) < 2: print "Errore: manca il nome del file." return nameF1 = sys.argv[1] nameF2 = nameF1 try: F1 = open(nameF1, 'r') except: print 'Errore: impossibile aprire il file "' + nameF1 + '" !!' return testo = F1.read() F1.close() F2 = open(nameF2, 'w') F2.write('# Ho premesso al file tutta questa riga \n') F2.write(testo) F2.close() print "Riga di avvio (sys.argv[0]): '" + sys.argv[0] + "'" print "Argomento uno (sys.argv[1]): '" + sys.argv[1] + "'" main()
#!/usr/bin/env python # prg. somma.py <x> <y> # 18-04-2006 ByteMan OpenWeb # Somma due valori positivi inseriti contestualmente. import sys def somma(x,y): z = x for i in range(y): z += 1 return z def main(): x = int(sys.argv[1]) y = int(sys.argv[2]) z = somma(x, y) print x, "+", y, "=", z main()
L'esempio del calcolo del fattoriale illustra sia l'uso di if, elif, else, sia un semplice caso di ricorsione.
# prg. fatt01.py <x> # 18-04-2006 ByteMan OpenWeb # Calcola il fattoriale di un numero x. def Fatt(n): if type(n) != type(1): # esclude n non intero (verifica sul tipo) return -1 elif n < 0: # esclude n negativo return -2 elif n == 0: # singolarita' n=0 return 1 else: return n * Fatt(n-1) # calcolo ricorsivo def main(): x = input("Digita un numero: ") f = Fatt(x) if f == -1 : print "Errore (1): Il fattoriale e' definito solo per i valori interi." elif f == -2 : print "Errore (2): Il fattoriale e' definito solo per interi positivi." else: print f main()
2.4. Visualizzare un file su video
# prg. printfile.py # 19-04-2006 ByteMan OpenWeb # Visualizza un file su video. def main(): fname = raw_input("Nome del file: ") print '-' * 40 # Genera 40 trattini F1 = open(fname,'r') data = F1.read() print data main()
2.5. Generazione di numeri primi
# prg. nprimi.py # 25-04-2006 ByteMan OpenWeb # Genera tutti i numeri primi <= Nmax def primi(Nmax): for N in range(2, Nmax): # Verifica divisibilita' for D in range(2, N+1): flagOk = 1 if ((N % D) == 0) and (N != D): flagOk = 0 # Trovato un divisore break if flagOk: print N, primi(1000)
2.6. Generazione di password casuale
Chiamata senza parametri, la funzione GenPsw genera una password casuale di 8 caratteri, composta di lettere maiuscole/minuscole e cifre numeriche.
# prg. randpsw01.py # 26-04-2006 ByteMan OpenWeb # Generazione casuale di password import string, whrandom def GenPsw(ln=8, st=string.letters + string.digits): newpsw = '' for i in xrange(ln): newpsw = newpsw + whrandom.choice(st) return newpsw print GenPsw() print GenPsw(12,'xyzabcdefgMNQH567')
Ma è possibile anche specificare esplicitamente la lunghezza ln e la stringa st di caratteri da utilizzare.
Questa funzione serve per ripulire lo schermo di shell, indipendentemente dal sistema operativo.
# prg. clear01.py # 22-04-2006 ByteMan OpenWeb # Clear Screen import os def clearscreen(righe=100): """Clear Screen. righe e' un argomento opzionale usato soltanto in caso di emergenza. """ import os if os.name == "posix": # Unix/Linux/MacOS/BSD/etc os.system('clear') elif os.name in ("nt", "dos", "ce"): # DOS/Windows os.system('CLS') else: # Emergenza, per altri S.O. print '\n' * numlines clearscreen()
Si noti l'uso della docstring, racchiusa tra """, utile per l'autodocumentazione della funzione.
L'informazione sulla dimensione di un file puo' essere ottenuta in vari modi. I due metodi proposti utilizzano tecniche diverse: il primo sfrutta l'importazione dei moduli appositi os e stat, mentre il secondo ottiene un risultato analogo richiamando i metodi propri dell'oggetto file.
# prg. filesize.py # 22-04-2006 ByteMan OpenWeb # Dimensioni di un file import os, stat def filesize1(n): # Richiede i moduli os e stat info = os.stat(n) sz = info[stat.ST_SIZE] return sz def filesize2(n): # Non richiede moduli aggiuntivi F = open(n,'r') F.seek(0,2) sz = F.tell() F.seek(0,0) F.close() return sz filename = "clear01.py" print "(filesize1) - Il file contiene: ", filesize1(filename), " bytes." print "(filesize2) - Il file contiene: ", filesize2(filename), " bytes."
L'output sullo schermo di shell viene solitamente effettuato tramite print che provvede ad una serie di facilitazioni per l'utente. Talvolta, però, è necessario un controllo più preciso dell'output. Si veda in proposito il listato seguente.
# prg. write01.py # 22-04-2006 ByteMan OpenWeb # Standard output import sys # Modulo sys def main(): for i in range(10): print i, print for i in range(10): sys.stdout.write(str(i)) print main()
che produce a video quanto segue
0 1 2 3 4 5 6 7 8 9 0123456789
dove si può notare come gli spazi introdotti automaticamente dalla print non sono presenti con l'uso della
sys.stdout.write, che però tratta solamente stringhe.
2.10. Spedire un file, tramite FTP.
Tutti gli altri comandi FTP (lista/cambia/rinomina cartella, ripresa di un download interrotto, ...) sono descritti nel modulo ftplib.
# prg. ftpsend.py # 19-04-2006 ByteMan OpenWeb # Spedisce un file, tramite FTP. import ftplib # Modulo FTP def main(): server = 'www.miosito.org' utente = 'agente' passwd = 'secret007' F1 = 'immagine.gif' F2 = 'immagine.gif' session = ftplib.FTP(server,utente,passwd) # Connessione al server FTP myfile = open(F1,'rb') # Apre il file da spedire session.storbinary('STOR ' + F2, myfile) # Spedisce il file myfile.close() # Chiude il file session.quit() # Chiude la sessione FTP main()
2.11. Scaricare un file, tramite FTP.
Il classico download di un file
# prg. ftpdown.py # 23-04-2006 ByteMan OpenWeb # Spedisce un file, tramite FTP. import ftplib # Modulo FTP def main(): server = 'www.miosito.org' utente = 'agente' passwd = 'secret007' direct = 'pub/x-files' F1 = 'immagine.gif' F2 = 'immagine.gif' session = ftplib.FTP(server) # Connessione al server FTP session.login(utente, passwd) # Login session.cwd(direct) # Change directory myfile = open(F1,'wb') # Apre il file da prelevare session.retrbinary('RETR ' + F2, myfile.write) # Download del file myfile.close() # Chiude il file session.quit() # Chiude la sessione FTP main()
2.12. Controllare una casella postale.
# prg. mail01.py # 19-04-2006 ByteMan OpenWeb # Controllo di una casella di posta. import poplib, sys, time def controlla_posta(s,u,p): """Funzione che controlla una casella di posta""" try: connessione = poplib.POP3(s) connessione.user(u) connessione.pass_(p) nmex, sz = connessione.stat() connessione.quit() return nmex, sz except (poplib.socket.error, poplib.error_proto), messaggio: print 'Problema:', messaggio sys.exit(1) def main(): server = 'popmail.serv.org' utente = 'agente' passwd = 'secret007' interv = 120 while 1: try: numero_messaggi, dimensione = controlla_posta(server,utente,passwd) if numero_messaggi > 0: print 'Numero messaggi:', numero_messaggi, 'Dimensioni:', dimensione time.sleep(interv) except KeyboardInterrupt: print 'Sempre al suo servizio!' sys.exit(0) main()
2.13. Realizzare uno script CGI.
Common Gateway Interface è una tecnologia standard usata dai web server per interfacciarsi con applicazioni esterne che generano il codice HTML.
Questo semplice script d'esempio genera una pagina che visualizza la data e l'ora correnti del server. Dopo averlo esaminato è opportuno leggere le puntualizzazioni riportate in coda.
#!/usr/bin/env python import cgitb; cgitb.enable() # Abilita CGI import time def htmlpage(): print "<HTML>" print "<HEAD>" print "<TITLE>ByteMan OpenWeb - Ora</TITLE>" print "</HEAD>" print "<BODY>" print "<H2>Esempio di lettura dell'ora</h2>" print "<P>Data ed ora: %s</P>" % time.ctime() print "</BODY>" print "</HTML>" print "Content-type: text/html\n" # Prima riga 'print' obbligatoria htmlpage()
1) E' necessario che il gestore del server autorizzi l'uso di script Python.
2) La prima riga dello script riporta il path per trovare l'interprete Python sul server.
3) Tutte le righe print devono produrre codice HTML corretto.
4) La prima print (in ordine di esecuzione) deve essere quella riportata nel listato.
5) Quando lo script verrà caricato nella directory cgi-bin occorrerà impostargli il permesso di esecuzione.
2.14. Formattazione di un testo.
Questo esempio mostra l'uso di un semplice dizionario per sostituire in un file di testo le vocali accentate con le corrispondenti vocali apostrofate. Viene poi suddiviso il testo in paragrafi, assumendo che dopo ogni punto fermo inizi un nuovo paragrafo. Nel contempo si verifica che la prima lettera di ciascun paragrafo sia maiuscola. Un altro effetto ottenuto è che ogni paragrafo costituisce una riga unica doppiamente spaziata dalla successiva.
# -*- coding: iso-8859-1 -*- # prg. formatxt.py # 23-04-2006 ByteMan OpenWeb # Formattazione Testo def format(fname): # Lettura del file di testo origine f = open(fname) testo1 = f.read() f.close() # Definizione del dizionario delle vocali da sostituire diz = {"à":"a'", "á":"a'", "è":"e'", "é":"e'", "ì":"i'", "í":"i'", "ò":"o'", "ó":"o'", "ù":"u'", "ú":"u'"} for item in diz: testo1 = testo1.replace(item, diz[item]) testo1 = testo1.replace('\n',' ') # Formattazione del testo testo2 = '' paragrafi = testo1.split('.') for x in xrange(len(paragrafi)-1): testo2 = testo2 + paragrafi[x].lstrip().capitalize() + '.\n\n' # Scrittura del file con il testo aggiornato f = open(fname, 'w') f.write(testo2) f.close() # print testo2 format('esempio.txt')
La prima riga del listato, uno pseudocommento, imposta effettivamente il tipo di codifica per interpretare i codici dei caratteri.
Da notare, poi, il metodo replace per sostituire ripetutamente tutte le lettere interessate, il metodo split
per dividere il testo in paragrafi, il metodo lstrip per eliminare gli spazi iniziali, ed il metodo capitalize
per ottenere la prima lettera maiuscola di ogni paragrafo. L'uso della classe xrange(), al posto di range(), restituisce un oggetto invece che una lista. Nei loop questo comporta una maggior velocità ed un uso più efficiente della memoria.
2.15. Sostituzione stringhe in un testo.
#!/usr/bin/env python # prg. quotecomm.py # 27-04-2006 ByteMan OpenWeb # Sostituzione stringhe in un file import sys def main(): if len(sys.argv) < 2: print "Errore: manca il nome del file." return nameF1 = sys.argv[1] nameF2 = nameF1 try: F1 = open(nameF1, 'r') except: print 'Errore: impossibile aprire il file "' + nameF1 + '" !!' return testo = F1.read() F1.close() testo = testo.replace('"</font><font color="#008000">', '"') testo = testo.replace('"#008000">"""', '"#444444">"""') F2 = open(nameF2, 'w') F2.write(testo) F2.close() main()
2.16. Grafico funzione tramite gnuplot.
Gnuplot è un semplice programma open source per produrre grafici rapidamente a partire da un file di dati o da espressioni analitiche. Dopo aver installato i pacchetti per utilizzarlo:
apt-get install gnuplot gnuplot-x11 apt-get install python-gnuplot
python consente di utilizzarne le funzioni dentro gli script. L'esempio mostra le basi di partenza per visualizzare una funzione trigonometrica.
#!/usr/bin/env python # prg. gplot.py # 12-05-2006 ByteMan OpenWeb import Gnuplot g = Gnuplot.Gnuplot() g.title('Test Funzione Coseno') # Titolo del grafico g.xlabel('X') # Scritta lungo l'asse X g.ylabel('Y') # Scritta lungo l'asse Y g.set_range('xrange', '[0:10]') # Impostazione intervallo X g.set_range('yrange', '[-1.01:1.01]') # Impostazione intervallo Y g('plot cos(x)') raw_input('Premere Invio per finire...') # Pausa per osservare il grafico
Amare è migliorare se stessi.
Oscar Wilde