Riferimenti: SoftPython - formati 1

EscSummer School Data Science 2023 - Modulo 1 informatica: Moodle
Docente: David Leoni david.leoni@unitn.it
Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it
binari: Sequenze di 0 e 1
.xls, .xlsx).ods).pdf).jpg, .jpeg, .png, .gif, .webp)per essere aperti richiedono librerie specializzate
di testo:
.txt.csv, .tsv.json.xml, .htmlApribili anche con Blocco note!
Riferimenti: SoftPython Formati 1 - File a linee
Leonardo
da Vinci
Sandro
Botticelli
Niccolò
Macchiavelli
with open('people-simple.txt', encoding='utf-8') as f:
linea=f.readline()
print(linea)
Leonardo
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
with open('people-simple.txt', encoding='utf-8') as f:
linea=f.readline()
print(linea)
Se non si chiude propriamente un file, si rischiano:
with CONTESTO
with open
with...with open('people-simple.txt', encoding='utf-8') as f:
linea=f.readline()
print(linea)
Nella parte as f:
fATTENZIONE: ricordati di mettere sempre il carattere dei doppi punti : alla fine della linea del with !
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
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
while¶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):
f.readline() ritorna una stringa vuotafor¶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!
for vs while¶for: tipicamente per iterare tutto il file
while: per maggior controllo
Per esempi di ricerca: Cicli while - ricercare in una sequenza
f ?¶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...
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']
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 []
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.
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']