2010-08-27 14 views
8

Ho un programma che emette alcuni elenchi che voglio archiviare per lavorare successivamente. Ad esempio, supponiamo che generi un elenco di nomi di studenti e un altro elenco dei punteggi medi. Posso archiviare questa uscita nei seguenti due modi:Pickle vs output in un file in python

standard Senso dell'uscita File:

newFile = open('trialWrite1.py','w') 
newFile.write(str(firstNames)) 
newFile.write(str(midterm1Scores)) 
newFile.close() 

Il modo salamoia:

newFile = open('trialWrite2.txt','w') 
cPickle.dump(firstNames, newFile) 
cPickle.dump(midterm1Scores, newFile) 
newFile.close() 

Quale tecnica è migliore o preferito? C'è un vantaggio nell'usare l'uno sull'altro?

Grazie

risposta

3

pickle è più generico - permette di dump di diversi tipi di oggetti in un file per un uso successivo. Il rovescio della medaglia è che lo storage temporaneo non è molto leggibile, e non in un formato standard.

Scrivere stringhe su un file, d'altra parte, è un'interfaccia molto migliore per altre attività o codice. Ma ha il costo di dover analizzare di nuovo il testo nel tuo oggetto Python.

Entrambi vanno bene per questo semplice (elenco?) Dati; Vorrei usare write(firstNames) semplicemente perché non è necessario usare pickle. In generale, come mantenere i dati nel filesystem dipende dai dati!


Per esempio, pickle volontà funzioni felicemente salamoia, che non si può fare semplicemente scrivendo le rappresentazioni di stringa.

>>> data = range 
<class 'range'> 
>>> pickle.dump(data, foo) 
# stuff 
>>> pickle.load(open(..., "rb")) 
<class 'range'. 
+4

'pickle' non asseconda esattamente le funzioni e le classi come si potrebbe presumere - (http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled)" Nota quelle funzioni (built-in e definite dall'utente) sono decimate dal riferimento al nome "completo", non dal valore ... "La persistenza in questo caso si basa su gerarchie di moduli e interfacce stabili poiché l'ambiente di disfacimento deve corrispondere all'ambiente di pickling. –

+0

Grazie per la risposta. Scriverò la rappresentazione della stringa o userò CSV come suggerito da David. – Curious2learn

+0

@Jeremy: Non mi rendevo conto che 'pickle' non mi piaceva le funzioni definite dall'utente - grazie! Il sottaceto – katrielalex

4

penso che il modulo csv potrebbe essere una buona misura qui, dal momento che CSV è un formato standard che può essere sia letto e scritto da Python (e molte altre lingue), ed è anche leggibile. L'utilizzo potrebbe essere semplice come

with open('trialWrite1.py','wb') as fileobj: 
    newFile = csv.writer(fileobj) 
    newFile.writerow(firstNames) 
    newFile.writerow(midterm1Scores) 

Tuttavia, avrebbe probabilmente più senso scrivere uno studente per riga, incluso il nome e il punteggio. Ciò può essere fatto in questo modo:

from itertools import izip 
with open('trialWrite1.py','wb') as fileobj: 
    newFile = csv.writer(fileobj) 
    for row in izip(firstNames, midterm1Scores): 
     newFile.writerow(row) 
+0

Penso che 'writerow' si aspetta una tupla non una collezione con stringhe. – katrielalex

+1

Secondo la documentazione, prenderà qualsiasi sequenza, incluse liste o tuple. –

+0

Se uso la riga 'newFile.close()', viene visualizzato un errore che dice che l'oggetto "'_csv.writer' non ha alcun attributo 'close'" – Curious2learn

0

Per un approccio completamente diverso, ritengono che Python ships with SQLite. È possibile memorizzare i dati in un database SQL senza aggiungere dipendenze di terze parti.

+0

Ho bisogno di usare i dati per tracciare grafici con matplotlib. Potrei importare da SQlite ma sembra troppo lavoro per esportarlo e importarlo. – Curious2learn

Problemi correlati