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

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
# 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 con
py .\parameters.py 1.3 4
da come risultato
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
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.

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()
# 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()
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 as
with open("esempio.txt") as esempio_handler:
    for line in esempio_handler:
        print("linea: ", line)
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 ....
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
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!")
Nel caso di lettura di un file binario, va aggiunto b
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à w
with open("esempio.txt","w") as esempio_handler:
    esempio_handler.write("Testo di esempio")
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
with open("esempio.txt","a") as esempio_handler:
    esempio_handler.write("\nTesto in aggiunta")
I parametri possibili sono
  • 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"
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 momento
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.
Su Linux per la versione 3.x di Python va usato il comando pip3
La sintassi per installare un pacchetto è
pip nome_pacchetto
il pacchetto viene installato nella macchina a livello globale.
Per vedere tutti i pacchetti installati si può usare il comando
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
flask
flask-cors
flask-restful
pyodbc
l'installazione avviene tramite il comando
pip install -r requirements.txt

Json


Sempre più spesso le applicazioni devono poter gestire dati in formato Json, per gestire questo formato Pyphon mette a disposizione la libreria json.

Ad esempio per convertire una lista in una stringa json, posso usare il metodo dumps
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
da come risulato
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 oggetto
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"])
da come risulato
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