Domanda Leggere/scrivere su un file e modulo pickle

Stato
Discussione chiusa ad ulteriori risposte.

xXShïñëgødXx

Utente Silver
10 Gennaio 2012
205
11
24
92
Ultima modifica:
Salve a tutti Pythonisti,oggi parleremo della scrittura su file e lettura più il modulo pickle!
Lettura e scrittura su file
Bene,penso che la maggior parte di voi sappiano che leggere dati da un file e scriverci sopra sono delle operazioni elementari e allo stesso tempo importanti se si ha intenzione di scrivere un programma che interagisca con i file. Vediamo subito un esempio:
Codice:
f = open("D:/Lol.txt", "r") #Apriamo il file nella sua directory in modalità lettura "r"
f.readline() #leggiamo una riga del file per volta
f.readlines() #leggiamo tutte le righe del file
f.close() #chiudiamo il file
E questo è il codice per scrivere su un file:
Codice:
f = open("D:/Lol.txt", "w") #Apriamo il file in modalità scrittura con "w"
f.write("Ciao")
f.close()
Inoltre possiamo aprire un file sia in modalità scrittura che lettura:
Codice:
f = open("D:/Lol.txt", "r+") #Con "r+"
f.write("Lol") #I primi 3 caratteri del file verranno modificati,quindi l'output sarà "Lolo" con la o finale di Ciao scritto in precedenza
f.readline()
f.close()
Possiamo anche iterare le righe di un file,ma con l'aggiunta della direttiva with: vi spiego il perchè.
Se noi scrivessimo:
Codice:
for line in open("C:/lol.txt"):
print line
funzionerebbe,ma il file dopo l'esecuzione del codice non verrebbe chiuso. Invece è preferibile farlo,quindi usando with risolviamo la problematica,in quanto dopo l'esecuzione del codice il file viene chiuso.
Codice:
with open("C:/lol.txt") as f:
for line in f:
print line
La direttiva with chiude il file a prescindere dall'esito del blocco di codice, sia che venga incontrata un'eccezione che non.
Giusto per arricchire la guida,facciamo un semplice esempio anche utilizzando un costrutto gestore delle eccezioni.
Codice:
def funzione():
    try:
        f = open("C:/lol.txt", "r+")
        f.write("Hi CB")
    except IOError:
        print "Directory errata o file inesistente."
    else:
             f.write(" and UG")
    finally:
     print "Fine."
funzione = funzione()
Se tutto va bene,il blocco di codice try verrà eseguito ed except verrà saltato. Se invece come specifica il messaggio,si verifica un errore,il blocco di codice except verrà eseguito e try verrà saltato. Il blocco di codice else può essere considerato come una continuazione del blocco di codice try,che quindi aggiunge operazioni da eseguire nel caso non venga eseguito nulla del blocco di codice except. Infine finally verrà eseguito in ogni caso insieme al blocco di codice try oppure except o else e,in questo caso,ha la sola utilità di comunicare che il codice è stato eseguito(in un modo o nell'altro),quindi inserirlo è opzionale. Inoltre,è bene notare che nel caso in cui si incontri un'eccezione non gestita nel blocco di codice try/except/else,tale eccezione verrà temporaneamente salvata,il blocco di codice finally verrà eseguito e l'eccezione verrà ri-sollevata(azioni di clean up).
Modulo Pickle
Il modulo pickle può essere utilizzato per "conservare" il tipo di dato che viene salvato in un file.
Quando scriviamo qualcosa con il metodo write possiamo inserire solo stringhe,e siamo così costretti ad effettuare un type casting se vogliamo inserire un numero intero per esempio: e comunque se proviamo a leggere con readline/readlines ciò che abbiamo appena scritto otterremo come output un tipo di dato "list",quindi non il tipo di dato originale.
Con il modulo pickle possiamo invece mantenere il tipo di dato originale.
Codice:
import pickle
f = open("D:/Lol.txt", "r+")
pickle.dump("Hi CB", f) #Salviamo "Hi CB" sul file
f.close()
f = open("D:/Lol.txt", "r+")
a = pickle.load(f)  #Carichiamo il contenuto del file
a #L'output sarà "Hi CB"
Per verificare,proviamo a fare:
Codice:
a = pickle.load(f)
type(a)
Codice:
<type "str">
In alternativa a pickle,c'è anche cPickle(scritto in C) che è più performante ma non supporta classi ed ereditarietà per via della non appartenenza al C al paradigma della programmazione orientata agli oggetti.

Saluti :bye:
 
Stato
Discussione chiusa ad ulteriori risposte.