Formati file 1: intro, file a linee¶

Riferimenti: SoftPython - formati 1

  • visualizza al meglio in
  • versione stampabile: clicca qua
  • per navigare nelle slide: premere Esc


Summer School Data Science 2023 - Modulo 1 informatica: Moodle

Docente: David Leoni david.leoni@unitn.it

Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it

File¶

binari: Sequenze di 0 e 1

  • Excel (.xls, .xlsx)
  • LibreOffice Calc (.ods)
  • Adobe PDF (.pdf)
  • Immagini (.jpg, .jpeg, .png, .gif, .webp)
  • ...

per essere aperti richiedono librerie specializzate

di testo:

  • .txt
  • .csv, .tsv
  • .json
  • .xml, .html
  • ...

Apribili anche con Blocco note!

File a linee¶

  • file di testo
  • informazioni raggruppate per linee

Riferimenti: SoftPython Formati 1 - File a linee

people-simple.txt:

Leonardo
da Vinci
Sandro
Botticelli
Niccolò 
Macchiavelli

Serve leggere 'per linea'?¶

Quando capitano file:

  • in formati strani
  • enormi
  • corrotti

Esempio lettura¶

In [2]:
with open('people-simple.txt', encoding='utf-8') as f:
    linea=f.readline()
    print(linea)
Leonardo

La codifica encoding¶

dipende da sistema operativo, editor

se non specifichi la codifica, Python prova a indovinare...

...se sbaglia -> vedrai caratteri strani (es. quadratini)

Meglio specificare!

  • il più comune: utf-8

  • altrimenti, qui in Italia: encoding='latin-1'

  • Per fare la detection: Charset Normalizer tool online | libreria

  • Approfondimenti: SoftPython - capitolo Stringhe - encodings

Aprire e chiudere un file 1/3¶

with open('people-simple.txt', encoding='utf-8') as f:
    linea=f.readline()
    print(linea)

Se non si chiude propriamente un file, si rischiano:

  • spreco di risorse
  • errori strani

with CONTESTO

  • definisce un blocco di codice con degli automatismi

with open

  • anche se accadono errori nel corpo del with...
  • ... alla fine Python chiuderà automaticamente il file

Aprire e chiudere un file 2/3¶

with open('people-simple.txt', encoding='utf-8') as f:
    linea=f.readline()
    print(linea)

Nella parte as f:

  • abbiamo assegnato il file ad una variabile chiamata qui f
  • ma potevamo usare un qualunque altro nome

ATTENZIONE: ricordati di mettere sempre il carattere dei doppi punti : alla fine della linea del with !

Aprire e chiudere un file 3/3¶

In [3]:
with open('people-simple.txt', encoding='utf-8') as f:
    nome=f.readline()      # sposta in avanti il cursore di lettura
    cognome=f.readline()   # legge dalla *nuova* posizione del cursore!
    print(nome + ' ' + cognome)
Leonardo
 da Vinci

nome=f.readline() mette in nome l'intera linea: vedi problemi?

ATTENZIONE: f.readline() metterà alla fine il carattere di ritorno a capo \n

In [4]:
with open('people-simple.txt', encoding='utf-8') as f:
    nome=f.readline().rstrip()    # meglio...
    cognome=f.readline().rstrip()
    print(nome + ' ' + cognome)
Leonardo da Vinci

Leggere tutto il file con while¶

In [5]:
with open('people-simple.txt', encoding='utf-8') as f:
    linea=f.readline()
    while linea != "":                
        nome = linea.rstrip()
        cognome=f.readline().rstrip()
        print(nome + ' ' + cognome)
        linea=f.readline()
Leonardo da Vinci
Sandro Botticelli
Niccolò Macchiavelli

Se siamo alla fine del file (o il file è vuoto):

  • la chiamata a f.readline() ritorna una stringa vuota

Leggere con un for¶

In [6]:
with open('people-simple.txt', encoding='utf-8') as f:    
    for linea in f:
        print(linea)
Leonardo

da Vinci

Sandro

Botticelli

Niccolò 

Macchiavelli

non abbiamo più chiamate a f.readline()

Quando incontra il ciclo, Python automagicamente fa un sacco di cose!

  • solo per i file di testo!

for vs while¶

for: tipicamente per iterare tutto il file

while: per maggior controllo

  • es stai cercando qualcosa in un file enorme e vuoi fermarti appena lo trovi

Per esempi di ricerca: Cicli while - ricercare in una sequenza

  • su liste invece che file, ma stesso concetto

Come materializzare f ?¶

In [7]:
import csv
with open('people-simple.txt', encoding='utf-8', newline='') as f:        
    print(f)
<_io.TextIOWrapper name='people-simple.txt' mode='r' encoding='utf-8'>

Indovinate...

In [8]:
with open('people-simple.txt', encoding='utf-8', newline='') as f:    
    print(list(f))
['Leonardo\n', 'da Vinci\n', 'Sandro\n', 'Botticelli\n', 'Niccolò \n', 'Macchiavelli']

NON consumare due volte nel with¶

with open('people-simple.txt', encoding='utf-8', newline='') as f:            
    print(list(f))
    print(list(f))
['Leonardo\n', 'da Vinci\n', 'Sandro\n', 'Botticelli\n', 'Niccolò \n', 'Macchiavelli']
[]

ATTENZIONE: qualunque lettura muove in avanti il cursore di lettura!

Alla seconda chiamata il file è ormai 'consumato' e stampa []

NON consumare f fuori dal with¶

with open('people-simple.txt', encoding='utf-8') as f:        
    print("Occhio all'indentazione..")

print(list(f))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[16], line 6
      4 with open('people-simple.txt', encoding='utf-8', newline='') as f:        
      5     print("Occhio all'indentazione..")
      6
----> 7 print(list(f))   # BOOM!

ValueError: I/O operation on closed file.

Se proprio vuoi consumare due volte...¶

In [9]:
with open('people-simple.txt', encoding='utf-8', newline='') as f:            
    print(list(f))
    
with open('people-simple.txt', encoding='utf-8', newline='') as f:      
    print(list(f)) 
['Leonardo\n', 'da Vinci\n', 'Sandro\n', 'Botticelli\n', 'Niccolò \n', 'Macchiavelli']
['Leonardo\n', 'da Vinci\n', 'Sandro\n', 'Botticelli\n', 'Niccolò \n', 'Macchiavelli']
In [10]: