Keywords: easytut-it

Next: Occuparsi dell'imperfetto (o come Up: Tutorial per principianti in Previous: La rivincita delle stringhe Indice
Subsections

- Esercizi

# 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`.

# Esercizi

Modificate il programma dei voti del Capitolo 11 per salvare su di un file la registrazione degli studenti.

Next: Occuparsi dell'imperfetto (o come Up: Tutorial per principianti in Previous: La rivincita delle stringhe Indice