Cominciare ad usare Python - Parte 3
Questa è la continuazione della precedente Parte 1 e Parte 2 su Python. In questo post illustrerò: gli argomenti passati da linea di comando, la gestione dei file, il comado pip, le librerie di terze parti ed infine come trattare i dati in formato Json
Per accedere ai parametri in Python si usa la libreria sys con la relativa proprietà argv.
In questo esempio, passando due parametri numerici, viene eseguita la somma
da come risultato
Il metodo sys.exit(numero) si usa per terminare il programma. Il parametro numerico rappresenta il codice di ritorno del programma, un valore 0 indica terminato in modo corretto, un qualunque altro valore indica una condizione di errore.
che gestisce in automatico la chiusura del file una volta raggiunta la fine del blocco di istruzioni.
In questo esempio ho letto il file una linea alla volta con for ... in ....
Ovviamente, anche quando si lavora con i file, vanno sempre gestite le eccezioni
Nel caso di lettura di un file binario, va aggiunto b
in questo caso il file viene completamente sovrascritto e il contenuto precedente va perso, se il file non esiste verrà creato.
Viceversa, per andare in aggiunta (append) in coda ad un file esistente, si usa il parametro a
I parametri possibili sono
Queste possono essere installate tramite il gestore di pacchetti pip.La sintassi per installare un pacchetto è
il pacchetto viene installato nella macchina a livello globale.
Per vedere tutti i pacchetti installati si può usare il comando
Per installare più pacchetti contemporaneamente si può creare un file di testo, per convenzione di nome requirements.txt, contenente l'elenco dei pacchetti da installare, uno per ogni riga
l'installazione avviene tramite il comando
Ad esempio per convertire una lista in una stringa json, posso usare il metodo dumps
da come risulato
da come risulato
Esistono anche i metodi dump e load, senza la s finale, che leggono o scrivono direttamente su file anziché su una stringa.
Non è assolutamente esaustiva, per approfondire l'argomento si può fare riferimento alla guida ufficiale https://docs.python.it/ o cercare su Google i vari tutorial testuali o video.
Rivedi la Parte 1 e Parte 2
Argomenti
A volte può tornare utile gestire i parametri passati direttamente dalla linea di comando.Per accedere ai parametri in Python si usa la libreria sys con la relativa proprietà argv.
In questo esempio, passando due parametri numerici, viene eseguita la somma
Python
# parameters.py
import sys
# sys.argv da l'accesso ai parametri
args_number = len(sys.argv)
print(f"Numero di argomenti: {args_number}")
# stampo i parametri passati
i = 0
while i < len(sys.argv):
print("parametro: ", i, " valore = ", sys.argv[i])
i += 1
# 3 perché il primo parametro è il nome del file
if len(sys.argv) < 3:
print("Minimo 2 parametri")
# termino il programma se il numero dei parametri non è corretto
sys.exit(1)
# trasformo gli argomenti da string a float
arg1 = float(sys.argv[1])
arg2 = float(sys.argv[2])
# stampo il risultato
print(f"Somma: {arg1} + {arg2} = {arg1 + arg2}")
Il primo parametro, sys.argv[0], è sempre il nome del file, nell'esempio .\parameters.py
richiamandolo conDOS / Batch file
py .\parameters.py 1.3 4
DOS / Batch file
Numero di argomenti: 3
parametro: 0 valore = .\parameters.py
parametro: 1 valore = 1.3
parametro: 2 valore = 4
Somma: 1.3 + 4.0 = 5.3
Gestione dei file
In Python è possibile leggere e scrivere file di testo o binari in modo nativo.Lettura / Read
In caso di lettura, la prima operazione da fare è aprire il file con open()Python
# supponendo di leggere un file dal percorso corrente, default in sola lettura
handle = open("esempio.txt")
# oppure posso specificare un percorso completo ed indicare la modalità di apertura,
# in questo caso in sola lettura, ultimo parametro "r"
handle = open(r"c:\test\esempio.txt", "r")
la lettera r prima della stringa del percorso del file serve per per trattare la stringa come raw, ovvero senza processare le sequenze di escape, come as esempio \t
Per leggere un file intero uso il metodo read()Python
handle = open("esempio.txt")
data = handle.read()
print(data)
handle.close()
I file vanno sempre chiusi dopo l'uso con handle.close()
Un alternativa migliore all'invocazione del metodo close() è quella di usare le keyword with e asPython
with open("esempio.txt") as esempio_handler:
for line in esempio_handler:
print("linea: ", line)
In questo esempio ho letto il file una linea alla volta con for ... in ....
Per chi conosce il C#, with ... as ... è l'equivalente delle keyword using
Ovviamente, anche quando si lavora con i file, vanno sempre gestite le eccezioni
Python
try:
with open("esempio.txt") as esempio_handler:
# in questo caso leggo tutto le linee del file in un array di stringhe
data = esempio_handler.readlines()
print(data)
except IOError:
print("Errore di IOError!")
Python
open("esempio.txt", "rb")
Scrittura / Write
Anche in caso di scrittura la prima cosa da fare è aprire il file con open(), ma questa volta il parametro sarà wPython
with open("esempio.txt","w") as esempio_handler:
esempio_handler.write("Testo di esempio")
Viceversa, per andare in aggiunta (append) in coda ad un file esistente, si usa il parametro a
Python
with open("esempio.txt","a") as esempio_handler:
esempio_handler.write("\nTesto in aggiunta")
- r: lettura
- w: scrittura
- a: scrittua in append (aggiunge alla fine del file)
- +: in aggiunta a r, w e a indica l'apertura di un file sia in lettura che in scrittura
- b: in aggiunta a r, w e a indica l'apertura di un file in modalità binaria
UTF-8
Gli esempi precedenti non gestiscono correttamente i file in formato UTF-8. Se voglio leggere un file con questa codifica, devo aggiungere un terzo parametro alla open, ovvero encoding="UTF-8"Python
with open("esempio.txt", "r", encoding="utf-8") as esempio_handler:
s = esempio_handler.read()
print(s)
Pass
Spesso negli esempi di codice Python compare la keyword pass. Si tratta di un istruzione che non fa niente, è usata solitamente negli esempi, oppure per indicare il corpo di una funzione o di una classe che verrà implementata in un secondo momentoPython
def nuova_funzione:
pass # todo: ricordarsi di implementare la funzione
Librerie di terze parti
Python ha a disposizione una ampia varietà di librerie di terze parti. Si può cercare uno specifico pacchetto al link https://pypi.org/Queste possono essere installate tramite il gestore di pacchetti pip.La sintassi per installare un pacchetto è
DOS / Batch file
pip nome_pacchetto
Per vedere tutti i pacchetti installati si può usare il comando
DOS / Batch file
pip list
Per installare più pacchetti contemporaneamente si può creare un file di testo, per convenzione di nome requirements.txt, contenente l'elenco dei pacchetti da installare, uno per ogni riga
Text
flask
flask-cors
flask-restful
pyodbc
DOS / Batch file
pip install -r requirements.txt
Json
Sempre più spesso le applicazioni devono poter gestire dati in formato Json, per gestire questo formato Python mette a disposizione la libreria json.Ad esempio per convertire una lista in una stringa json, posso usare il metodo dumps
Python
import json
# creo una lista
lista1 = [1, 'simple', 'list']
print(len(lista1))
# 3
# la converto in una stinga json
str1 = json.dumps(lista1)
print(len(str1))
# 21
Text
3
21
[1, "simple", "list"]
Attenzione se nominate in file .py con lo stesso nome di un pacchetto esistente, ad esempio json.py e poi provate ad importare la libreria con import json, otterrete un errore in quanto il comando import darà la precedenza all'import del file locale json.py
Per fare il contrario, ovvero leggere una stringa che rappresenta un json e convertirla in un oggettoPython
import json
# creo una stringa che rappresenta un oggetto json
str_json = "{\"id\": 4, \"description\": \"Milano\", \"provincia\": {\"id\": 12, \"description\": \"Lombardia\"}}"
# la converto la stringa in oggetto
obj_json = json.loads(str_json)
# stampo i valori
print("id:", obj_json["id"])
print("description:", obj_json["description"])
print("provincia:", obj_json["provincia"])
print("provincia.id:", obj_json["provincia"]["id"])
print("provincia.description:", obj_json["provincia"]["description"])
Text
id: 4
description: Milano
provincia: {'id': 12, 'description': 'Lombardia'}
provincia.id: 12
provincia.description: Lombardia
Da notare la modalità per accedere alle proprietà del json tramite l'uso delle parentesi quadre e non tramite la notazione che usa il punto come avviene in JavaScript
Esistono anche i metodi dump e load, senza la s finale, che leggono o scrivono direttamente su file anziché su una stringa.
In JavaScript dumps() corrisponde a JSON.Stringify(), mentre loads() corrisponde a JSON.parse()
Conclusioni
Questa è solo una piccola guida per familiarizzare velocemente con Python per chi ha già nozioni di programmazione.Non è assolutamente esaustiva, per approfondire l'argomento si può fare riferimento alla guida ufficiale https://docs.python.it/ o cercare su Google i vari tutorial testuali o video.
Rivedi la Parte 1 e Parte 2