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

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 con

DOS / Batch file

py .\parameters.py 1.3 4
da come risultato

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
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()

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 as

Python

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

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!")
Nel caso di lettura di un file binario, va aggiunto b

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à w

Python

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

Python

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"

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 momento

Python

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 è

DOS / Batch file

pip nome_pacchetto
il pacchetto viene installato nella macchina a livello globale.
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
l'installazione avviene tramite il comando

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
da come risulato

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 oggetto

Python

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

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
Tags:
Esempi224 JSON31 NodeJs21 Python12
Potrebbe interessarti anche: