Capitolo 15. File IO

Questo è un semplice esempio di File IO:

#Write a 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()

#Read a file
in_file = open("test.txt","r")
text = in_file.read()
in_file.close()

print text,
L'output e i contenuti del file test.txt sono:
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 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 (dipendentemente da 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, "w" in scrittura. Dopodiché potrete chiamare le funzioni dell'oggetto file. Le due funzioni più comuni sono read e write: la funzione read legge il file e ne ritorna il contenuto sottoforma di stringa, la funzione write aggiunge una stringa alla fine del file.

Questa è una nuova versione dell'agenda telefonica che abbiamo scritto precedentemente:

import string

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 1:
        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 files.

Output:

> 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()

Analiziamo la funzione save_numbers del programma. 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+","+nombers[x]+"\n"). In questo modo scrive una linea contenente il nome, una virgola ed il numero, seguito da un 'a capo' (newline).

La funzione load_numbers è un po' più complessa. Inizia creando un oggetto file quindi usa un ciclo while per scorrere il file e leggere le linee con l'istruzione in_line = in_file.readline() finché non incontra un break. L'istruzione if esegue un controllo e uscirà dal ciclo while con una istruzione break nel momento in cui incontrerà la fine del file (len(in_line) == 0) .

L'istruzione in_line = in_line[:-1] elimina l'ultimo carattere della linea (il newline che farebbe andare a capo la linea) e 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.