Python logo above the word Python

Python | Lavorare sui file

Leggere un file TXT

proverbs_file = open("proverbi.txt")
print(proverbs_file)

proverbs_file.seek(0)

Il puntatore ora verrà posizionato alla fine, se riproveremo a stampare il file avrevo un outpt vuoto. Va perciò aggiunto il metodo.seek(0) che ricolloca il puntatore in posizione zero.

E’ anche possibile leggere il contenuto di un file riga per riga usando il metodo read_lines()

proverbs_file.seek(0)
proverbs_file.readlines()

La funzione ha ritornato una lista con ogni riga del file. Possiamo iterare sulla lista ritornata dal metodo readlines.

proverbs_file.seek(0)

for proverb in proverbs_file.readlines():
  print("Proverbio: %s" % proverb[:-1]) # rimuoviamo l'ultimo carattere che rappresenta una nuova linea (\n)

Chiusura di un file

Quando non abbiamo più bisogno del file, dobbiamo sempre ricordare di chiuderlo utilizzando il metodo close().

proverbs_file.close()

Per evitare questo inconveniente si utilizza anche un altro metodo per leggere i file che chiude automaticamente il file quando usciamo dal contesto.

with open("proverbi.txt") as proverbs_file:
  proverbs = proverbs_file.readlines()
  
# stampiamo il primo proverbio
print(proverbs[0])

# stampiamo l'ultimo proverbio
print(proverbs[-1])

Scrivere su di un file

Per poter scrivere all’interno di un file dobbiamo aprire il file con i giusti permessi specificati nella funzione open:

  • r: apre il file in sola lettura (modalità di default)
  • r+: apre i file in lettura e scrittura, il puntatore viene posizionato all’inzio del file.
  • w: apre il file in sola scrittura, se il file esiste lo sovrascrive, se non esiste lo crea.
  • w+: apre il file in lettura e scrittura, se il file esiste lo sovrascrive, se non esiste lo crea.
  • a: apre il file in scrittura senza sovrascrivere il contenuto corrente.
  • a+: apre il file in lettura e scrittura senza sovrascrivere il contenuto corrente. Se il file non esiste lo crea.
proverbs_file = open("proverbi.txt", 'a+')

proverb = "\nIl vino buono sta nelle botti piccole"
proverbs_file.write(proverb)

proverbs_file.seek(0)
proverbs_file.read()

proverbs_file.close()

Creazione di un nuovo file

Possiamo creare un nuovo file con la funzione open utilizzando w (solo scrittura) o w+ (lettura e scrittura) come permessi.

proverbs_file = open('proverbi.txt')
new_proverbs_file = open('nuovi_proverbi.txt','w+')

Se dai uno sguardo alla tua directory corrente troverai al suo interno, oltre al file proverbi.txt, un nuovo file nuovi_proverbi.txt, per adesso vuoto. Scriviamoci dentro i primi 3 proverbi del file proverbi.txt.

for i,proverb in enumerate(proverbs_file.readlines()):
  if(i>=3):
    break
  print(proverb)
  new_proverbs_file.write(proverb)

Leggere file in formato binario

Di defaul la funzione open interpreta il contenuto del file come del testo, ma ci può capitare di dover aprire dei file che non contengono del testo, in tal caso posiamo aprirli in formato binario. Per farlo dobbiamo semplicemente aggiungere un carattere b ai permessi.

with open("proverbi.txt", "rb") as proverbs_file:
    proverbs = proverbs_file.readlines()
    print(proverbs)
    print(type(proverbs[0]))

Operare su file CSV

Il modulo CSV permette di operare su file csv in Python. Possiamo aprire un file csv passando il file alla classe DictReader.

import csv 

line_count = 0 

with open('shirts.csv') as csv_file: 
   csv_reader = csv.reader(csv_file) 

   for row in csv_reader: 
      if line_count==0: 
         print("Columns names:",row) 
      else: 
         print(f"Row {line_count}:",row) 

      line_count+=1

import csv

with open('shirts.csv') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    print(csv_reader.fieldnames) # stampiamo i nomi delle colonne

Possiamo iterare sulle varie colonne del file, ogni colonna sarà un dizionario.

import csv

with open('shirts.csv') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    print("%s\t%s\t%s\t" % tuple(csv_reader.fieldnames[1:]))
    for row in csv_reader:
        print("%s\t%s\t%s\t" % (row['taglia'], row["colore"], row["prezzo"]))
import csv

with open('shirts.csv', mode='a', newline='') as csv_file:
    csv_file.write("\n")
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow([100, "XL", "ciano", 39.99])
    csv_writer.writerow([101, "XXL", "magenta", 59.99])
with open('shirts2.csv', mode='a') as csv_file:
    columns = ["id", "taglia", "colore", "prezzo"]
    csv_writer = csv.DictWriter(csv_file, fieldnames=columns)
    csv_writer.writeheader()
    csv_writer.writerow({'id':1, 'taglia': 'XL', 'colore': 'ciano', 'prezzo': 39.99})
    csv_writer.writerow({'id':2, 'taglia': 'XXL', 'colore': 'magenta', 'prezzo': 59.99})
     


… e i TSV?

import csv

with open('shirts.tsv') as csv_file:
    csv_reader = csv.DictReader(csv_file, delimiter="\t")
    print("%s\t%s\t%s\t" % tuple(csv_reader.fieldnames[1:]))
    for row in csv_reader:
        print("%s\t%s\t%s\t" % (row['taglia'], row["colore"], row["prezzo"]))
with open('shirts2.tsv', mode='a') as csv_file:
    columns = ["id", "taglia", "colore", "prezzo"]
    csv_writer = csv.DictWriter(csv_file, fieldnames=columns, delimiter="\t")
    csv_writer.writeheader()
    csv_writer.writerow({'id':1, 'taglia': 'XL', 'colore': 'ciano', 'prezzo': 39.99})
    csv_writer.writerow({'id':2, 'taglia': 'XXL', 'colore': 'magenta', 'prezzo': 59.99})
     

Operare su file JSON

import json

inventory = {
    "abbigliamento":{
        "magliette":[
            {"taglia":"XL", "colore":"rosso", "prezzo":14.99},
            {"taglia":"L", "colore":"blu", "prezzo":16.99},
            {"taglia":"L", "colore":"bianco", "prezzo":12.99}
        ],
        "pantaloni":[
            {"taglia":46, "colore":"nero", "prezzo":24.99},
            {"taglia":48, "colore":"nero", "prezzo":24.99},
            {"taglia":50, "colore":"bianco", "prezzo":22.99}
        ]
    },
    "accessori":{
        "borsa":
        [
          {"marca":"Alvaro Vitali", "prezzo":79.99},
          {"marca":"Ingino Massini", "prezzo":49.99},
        ],
        "cinture":[
            {"colore":"nero", "prezzo":8.99},
            {"colore":"marrone", "prezzo":8.99}
        ]
    }
}

inventory_str = json.dumps(inventory)
print(type(inventory_str))
print(inventory_str)
     
inventory = json.loads(inventory_str)
print(type(inventory))
print(inventory)

Lettura e scrittura da file

with open("inventory.json", "w") as json_file:
  json.dump(inventory, json_file, indent = 6)
     

with open("inventory.json") as json_file:
  inventory = json.load(json_file)
  print(type(inventory))
  print(inventory)
with open("inventory.json", "r+") as json_file:
  inventory = json.load(json_file)
  inventory["accessori"]["borsa"].append({"marca":"Carmelino Panettiere", "prezzo":149.99})
  inventory["gift card"] = [10, 50 ,100]
  json_file.seek(0)
  json.dump(inventory, json_file, indent = 6)

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *