# 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,
This Text is going to out file Look at it and see
\n
nella stringa dice
a Python di andare a capo (newline) nel punto in cui compare.
Una panoramica sul file IO:
open
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"
> 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
.
Modificate il programma dei voti del Capitolo 11 per salvare su di un file la registrazione degli studenti.