2
23445
-23445
14234
12345
-3512
15. File IO
Questo è un semplice esempio di File IO:
# Scrive un file.
out_file = open("test.txt","w")
out_file.write("This Text is going to out file\nLook at it and see\n")
out_file.close()
# Legge un file.
in_file = open("test.txt","r")
text = in_file.read()
in_file.close()
print text,
L'output ed il contenuto del file test.txt è:
This Text is going to out file
Look at it and see
Osservate come il programma scriva un file chiamato test.txt nella directory nella quale viene eseguito. Il \n nella stringa dice a Python di andare a capo (newline) nel punto in cui compare.
Una panoramica sul file IO:
1. Aprite un oggetto file con la funzione open
2. Leggete o scrivete nell'oggetto file (a seconda di come l'avete aperto)
3. Chiudetelo
Il primo passo è usare un oggetto file grazie alla funzione open. La sintassi è oggetto_file = open (nome_file, modo) dove oggetto_file è la variabile contenente l'oggetto file, nome_file la stringa con il nome del file, e modo la modalità di apertura del file: "r" in lettura (read), "w" in scrittura (write). Dopodiché potrete chiamare le funzioni dell'oggetto file. Le due funzioni più comuni sono read e write. La funzione write aggiunge una stringa alla fine del file. La funzione read legge il file e ne ritorna il contenuto sottoforma di stringa. Se non vi sono argomenti, ritorna l'intero file (come nell'esempio).
Questa è una nuova versione dell'agenda telefonica che abbiamo scritto precedentemente:
import string
true = 1
false = 0
def print_numbers(numbers):
print "Telephone Numbers:"
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
print
def add_number(numbers,name,number):
numbers[name] = number
def lookup_number(numbers,name):
if numbers.has_key(name):
return "The number is "+numbers[name]
else:
return name+" was not found"
def remove_number(numbers,name):
if numbers.has_key(name):
del numbers[name]
else:
print name," was not found"
def load_numbers(numbers,filename):
in_file = open(filename,"r")
while true:
in_line = in_file.readline()
if in_line == "":
break
in_line = in_line[:-1]
[name,number] = string.split(in_line,",")
numbers[name] = number
in_file.close()
def save_numbers(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()
def print_menu():
print '1. Print Phone Numbers'
print '2. Add a Phone Number'
print '3. Remove a Phone Number'
print '4. Lookup a Phone Number'
print '5. Load numbers'
print '6. Save numbers'
print '7. Quit'
print
phone_list = {}
menu_choice = 0
print_menu()
while menu_choice != 7:
menu_choice = input("Type in a number (1-7):")
if menu_choice == 1:
print_numbers(phone_list)
elif menu_choice == 2:
print "Add Name and Number"
name = raw_input("Name:")
phone = raw_input("Number:")
add_number(phone_list,name,phone)
elif menu_choice == 3:
print "Remove Name and Number"
name = raw_input("Name:")
remove_number(phone_list,name)
elif menu_choice == 4:
print "Lookup Number"
name = raw_input("Name:")
print lookup_number(phone_list,name)
elif menu_choice == 5:
filename = raw_input("Filename to load:")
load_numbers(phone_list,filename)
elif menu_choice == 6:
filename = raw_input("Filename to save:")
save_numbers(phone_list,filename)
elif menu_choice == 7:
pass
else:
print_menu()
print "Goodbye"
Ora include anche il salvataggio e la lettura di file. Qui una parte dell'output dell'esecuzione ripetuta due volte:
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit
Type in a number (1-7):2
Add Name and Number
Name:Jill
Number:1234
Type in a number (1-7):2
Add Name and Number
Name:Fred
Number:4321
Type in a number (1-7):1
Telephone Numbers:
Name: Jill Number: 1234
Name: Fred Number: 4321
Type in a number (1-7):6
Filename to save:numbers.txt
Type in a number (1-7):7
Goodbye
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit
Type in a number (1-7):5
Filename to load:numbers.txt
Type in a number (1-7):1
Telephone Numbers:
Name: Jill Number: 1234
Name: Fred Number: 4321
Type in a number (1-7):7
Goodbye
Le nuove porzioni del programma sono:
def load_numbers(numbers,filename):
in_file = open(filename,"r")
while 1:
in_line = in_file.readline()
if len(in_line) == 0:
break
in_line = in_line[:-1]
[name,number] = string.split(in_line,",")
numbers[name] = number
in_file.close()
def save_numbers(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()
Per prima cosa osserviamo la porzione del programma che esegue il salvataggio. Innanzitutto crea un oggetto file con il comando open(filename,"w"), dopodiché crea una nuova linea per ognuno dei numeri di telefono con il comando out_file.write(x+","+numbers[x]+"\n"). In questo modo scrive una linea contenente il nome, una virgola ed il numero, seguito da un 'a capo' (newline).
La funzione che effettua il caricamento in memoria è un po' più complessa. Inizia creando un oggetto file, quindi usa il ciclo while 1: finché non incontra un'istruzione break. Successivamente passa alla linea in_line = in_file.readline(). La funzione readline ritorna una stringa vuota (len(string) == 0) quando viene raggiunta la fine del file. L'istruzione if esegue un controllo sul break e se è il caso, uscirà dal ciclo while. Naturalmente, se la funzione readline non restituisse il newline all'estremità della linea, non potremmo stabilire se è una stringa vuota, una linea vuota o la fine del file, per questo inseriamo il newline che readline restituisce, solamente dop lo elimineremo.
La linea in_line = in_line[:-1] elimina l'ultimo carattere della linea (il newline che farebbe andare a capo la linea). Nelle restanti istruzioni viene trattata la stringa, dividendola in base alla virgola, in due parti: [name,number] = string.split(in_line,","), nome e numero. Infine il numero viene inserito nel dizionario numbers.
15.1 Esercizi
Modificate il programma dei voti del Capitolo 11 per salvare su di un file la registrazione degli studenti.
16. Occuparsi dell'imperfetto (o come gestire gli errori)
Ora avete un programma perfetto, funziona senza crepe, ad eccezione di un dettaglio: va in crash se l'utente inserisce un input errato. Non abbiate paura, Python ha una speciale struttura di controllo per eliminare questi imprevisti. Sto parlando di try... try tenta di fare qualcosa. Segue un esempio di un programma che contiene un problema:
print "Type Control C or -1 to exit"
number = 1
while number != -1:
number = int(raw_input("Enter a number: "))
print "You entered: ",number
Se tentate di inserire qualcosa come @#& l'output sarà simile a questo:
Traceback (innermost last):
File "try_less.py", line 4, in ?
number = int(raw_input("Enter a number: "))
ValueError: invalid literal for int(): @#&
Come potete vedere la funzione int non funziona (e non deve funzionare) con il numero @#&. L'ultima linea mostra qual'è l'errore: Python ha trovato un ValueError. Come fare in modo che il nostro programma sappia gestire anche questo valore? Innanzitutto inserendo la parte di codice che restituisce l'errore in un blocco try e poi decidendo come Python debba trattare ValueError. Il seguente programma mostra come ottenere tale comportamento:
print "Type Control C or -1 to exit"
number = 1
while number != -1:
try:
number = int(raw_input("Enter a number: "))
print "You entered: ",number
except ValueError:
print "That was not a number."
Ora, quando eseguiremo il nuovo programma ed inseriremo @#&, il programma risponderà con la frase ``That was not a number.'' per poi continuare ciò che stava facendo prima.
Quando il vostro programma restituisce un errore che sapete come gestire, mettete il codice in un blocco try ed il modo per gestire l'errore nel successivo blocco except.
16.1 Esercizi
Aggiornate il programma della rubrica telefonica del capitolo precedente in modo che non si interrompa se l'utente non inserisce dati nel menu.
17. Fine
Sto lavorando per aggiungere ulteriori sezioni a questo documento. Per ora vi raccomando il "Python Tutorial" di Guido Van Rossum, ormai dovreste essere in grado di capire la maggior parte degli argomenti.
Questo tutorial è ancora un lavoro in corso. Gradirei qualsiasi tipo di commento e/o richiesta di argomenti da aggiungere. Le vostre e-mail mi hanno portato ad ampliare e migliorare notevolmente il documento, ed io ho sempre tenuto in molta considerazione ogni vostro intervento .
Buona programmazione, che possa cambiare la vostra vita e il mondo.
23445
-23445
14234
12345
-3512
15. File IO
Questo è un semplice esempio di File IO:
# Scrive un file.
out_file = open("test.txt","w")
out_file.write("This Text is going to out file\nLook at it and see\n")
out_file.close()
# Legge un file.
in_file = open("test.txt","r")
text = in_file.read()
in_file.close()
print text,
L'output ed il contenuto del file test.txt è:
This Text is going to out file
Look at it and see
Osservate come il programma scriva un file chiamato test.txt nella directory nella quale viene eseguito. Il \n nella stringa dice a Python di andare a capo (newline) nel punto in cui compare.
Una panoramica sul file IO:
1. Aprite un oggetto file con la funzione open
2. Leggete o scrivete nell'oggetto file (a seconda di come l'avete aperto)
3. Chiudetelo
Il primo passo è usare un oggetto file grazie alla funzione open. La sintassi è oggetto_file = open (nome_file, modo) dove oggetto_file è la variabile contenente l'oggetto file, nome_file la stringa con il nome del file, e modo la modalità di apertura del file: "r" in lettura (read), "w" in scrittura (write). Dopodiché potrete chiamare le funzioni dell'oggetto file. Le due funzioni più comuni sono read e write. La funzione write aggiunge una stringa alla fine del file. La funzione read legge il file e ne ritorna il contenuto sottoforma di stringa. Se non vi sono argomenti, ritorna l'intero file (come nell'esempio).
Questa è una nuova versione dell'agenda telefonica che abbiamo scritto precedentemente:
import string
true = 1
false = 0
def print_numbers(numbers):
print "Telephone Numbers:"
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
def add_number(numbers,name,number):
numbers[name] = number
def lookup_number(numbers,name):
if numbers.has_key(name):
return "The number is "+numbers[name]
else:
return name+" was not found"
def remove_number(numbers,name):
if numbers.has_key(name):
del numbers[name]
else:
print name," was not found"
def load_numbers(numbers,filename):
in_file = open(filename,"r")
while true:
in_line = in_file.readline()
if in_line == "":
break
in_line = in_line[:-1]
[name,number] = string.split(in_line,",")
numbers[name] = number
in_file.close()
def save_numbers(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()
def print_menu():
print '1. Print Phone Numbers'
print '2. Add a Phone Number'
print '3. Remove a Phone Number'
print '4. Lookup a Phone Number'
print '5. Load numbers'
print '6. Save numbers'
print '7. Quit'
phone_list = {}
menu_choice = 0
print_menu()
while menu_choice != 7:
menu_choice = input("Type in a number (1-7):")
if menu_choice == 1:
print_numbers(phone_list)
elif menu_choice == 2:
print "Add Name and Number"
name = raw_input("Name:")
phone = raw_input("Number:")
add_number(phone_list,name,phone)
elif menu_choice == 3:
print "Remove Name and Number"
name = raw_input("Name:")
remove_number(phone_list,name)
elif menu_choice == 4:
print "Lookup Number"
name = raw_input("Name:")
print lookup_number(phone_list,name)
elif menu_choice == 5:
filename = raw_input("Filename to load:")
load_numbers(phone_list,filename)
elif menu_choice == 6:
filename = raw_input("Filename to save:")
save_numbers(phone_list,filename)
elif menu_choice == 7:
pass
else:
print_menu()
print "Goodbye"
Ora include anche il salvataggio e la lettura di file. Qui una parte dell'output dell'esecuzione ripetuta due volte:
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit
Type in a number (1-7):2
Add Name and Number
Name:Jill
Number:1234
Type in a number (1-7):2
Add Name and Number
Name:Fred
Number:4321
Type in a number (1-7):1
Telephone Numbers:
Name: Jill Number: 1234
Name: Fred Number: 4321
Type in a number (1-7):6
Filename to save:numbers.txt
Type in a number (1-7):7
Goodbye
> python tele2.py
1. Print Phone Numbers
2. Add a Phone Number
3. Remove a Phone Number
4. Lookup a Phone Number
5. Load numbers
6. Save numbers
7. Quit
Type in a number (1-7):5
Filename to load:numbers.txt
Type in a number (1-7):1
Telephone Numbers:
Name: Jill Number: 1234
Name: Fred Number: 4321
Type in a number (1-7):7
Goodbye
Le nuove porzioni del programma sono:
def load_numbers(numbers,filename):
in_file = open(filename,"r")
while 1:
in_line = in_file.readline()
if len(in_line) == 0:
break
in_line = in_line[:-1]
[name,number] = string.split(in_line,",")
numbers[name] = number
in_file.close()
def save_numbers(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()
Per prima cosa osserviamo la porzione del programma che esegue il salvataggio. Innanzitutto crea un oggetto file con il comando open(filename,"w"), dopodiché crea una nuova linea per ognuno dei numeri di telefono con il comando out_file.write(x+","+numbers[x]+"\n"). In questo modo scrive una linea contenente il nome, una virgola ed il numero, seguito da un 'a capo' (newline).
La funzione che effettua il caricamento in memoria è un po' più complessa. Inizia creando un oggetto file, quindi usa il ciclo while 1: finché non incontra un'istruzione break. Successivamente passa alla linea in_line = in_file.readline(). La funzione readline ritorna una stringa vuota (len(string) == 0) quando viene raggiunta la fine del file. L'istruzione if esegue un controllo sul break e se è il caso, uscirà dal ciclo while. Naturalmente, se la funzione readline non restituisse il newline all'estremità della linea, non potremmo stabilire se è una stringa vuota, una linea vuota o la fine del file, per questo inseriamo il newline che readline restituisce, solamente dop lo elimineremo.
La linea in_line = in_line[:-1] elimina l'ultimo carattere della linea (il newline che farebbe andare a capo la linea). Nelle restanti istruzioni viene trattata la stringa, dividendola in base alla virgola, in due parti: [name,number] = string.split(in_line,","), nome e numero. Infine il numero viene inserito nel dizionario numbers.
15.1 Esercizi
Modificate il programma dei voti del Capitolo 11 per salvare su di un file la registrazione degli studenti.
16. Occuparsi dell'imperfetto (o come gestire gli errori)
Ora avete un programma perfetto, funziona senza crepe, ad eccezione di un dettaglio: va in crash se l'utente inserisce un input errato. Non abbiate paura, Python ha una speciale struttura di controllo per eliminare questi imprevisti. Sto parlando di try... try tenta di fare qualcosa. Segue un esempio di un programma che contiene un problema:
print "Type Control C or -1 to exit"
number = 1
while number != -1:
number = int(raw_input("Enter a number: "))
print "You entered: ",number
Se tentate di inserire qualcosa come @#& l'output sarà simile a questo:
Traceback (innermost last):
File "try_less.py", line 4, in ?
number = int(raw_input("Enter a number: "))
ValueError: invalid literal for int(): @#&
Come potete vedere la funzione int non funziona (e non deve funzionare) con il numero @#&. L'ultima linea mostra qual'è l'errore: Python ha trovato un ValueError. Come fare in modo che il nostro programma sappia gestire anche questo valore? Innanzitutto inserendo la parte di codice che restituisce l'errore in un blocco try e poi decidendo come Python debba trattare ValueError. Il seguente programma mostra come ottenere tale comportamento:
print "Type Control C or -1 to exit"
number = 1
while number != -1:
try:
number = int(raw_input("Enter a number: "))
print "You entered: ",number
except ValueError:
print "That was not a number."
Ora, quando eseguiremo il nuovo programma ed inseriremo @#&, il programma risponderà con la frase ``That was not a number.'' per poi continuare ciò che stava facendo prima.
Quando il vostro programma restituisce un errore che sapete come gestire, mettete il codice in un blocco try ed il modo per gestire l'errore nel successivo blocco except.
16.1 Esercizi
Aggiornate il programma della rubrica telefonica del capitolo precedente in modo che non si interrompa se l'utente non inserisce dati nel menu.
17. Fine
Sto lavorando per aggiungere ulteriori sezioni a questo documento. Per ora vi raccomando il "Python Tutorial" di Guido Van Rossum, ormai dovreste essere in grado di capire la maggior parte degli argomenti.
Questo tutorial è ancora un lavoro in corso. Gradirei qualsiasi tipo di commento e/o richiesta di argomenti da aggiungere. Le vostre e-mail mi hanno portato ad ampliare e migliorare notevolmente il documento, ed io ho sempre tenuto in molta considerazione ogni vostro intervento .
Buona programmazione, che possa cambiare la vostra vita e il mondo.