2010-08-27 28 views
8

Tengo un programa que genera algunas listas con las que quiero almacenar para trabajar más tarde. Por ejemplo, suponga que genera una lista de nombres de estudiantes y otra lista de puntajes de mitad de período. Puedo almacenar esta salida de las dos formas siguientes:Pickle vs salida a un archivo en python

estándar Manera de la salida del archivo:

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

La forma en salmuera:

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

qué técnica es mejor o preferido? ¿Hay una ventaja de usar uno sobre el otro?

Gracias

Respuesta

3

pickle es más genérico - que le permite volcar muchos tipos diferentes de objetos en un archivo para su uso posterior. La desventaja es que el almacenamiento intermedio no es muy legible, y no en un formato estándar.

La escritura de cadenas en un archivo, por otro lado, es una interfaz mucho mejor para otras actividades o códigos. Pero tiene el costo de tener que volver a analizar el texto en su objeto de Python.

Ambos están bien para esta simple (lista?) De datos; Yo usaría write(firstNames) simplemente porque no hay necesidad de usar pickle. ¡En general, cómo persistir sus datos en el sistema de archivos depende de los datos!


Por ejemplo, se pickle funciones felizmente salmuera, que no se puede hacer simplemente escribiendo las representaciones de cadena.

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

'pickle' no resume exactamente las funciones y clases que pueda suponer - (http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled)" Nota las funciones (integradas y definidas por el usuario) se seleccionan por referencia de nombre "totalmente calificado", no por valor ... "La persistencia en este caso depende de las interfaces y las jerarquías de módulos estables, ya que el entorno de desapilado debe coincidir con el entorno de decapado. –

+0

Gracias por la respuesta. Escribiré la representación de cadena o usaré CSV como David sugirió. – Curious2learn

+0

@Jeremy: No me di cuenta de que a 'pickle' no le gustaban las funciones definidas por el usuario, ¡gracias! – katrielalex

4

creo que el módulo de csv podría ser una buena opción aquí, ya CSV es un formato estándar que puede ser a la vez leída y escrita por Python (y muchos otros idiomas), y también es legible. Uso podría ser tan simple como

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

Sin embargo, sería probablemente más sentido para escribir un estudiante por fila, incluyendo su nombre y puntuación. Eso se puede hacer así:

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

Creo que 'writerow' espera una tupla, no una colección de cadenas. – katrielalex

+1

De acuerdo con la documentación, tomará cualquier secuencia, incluidas listas o tuplas. –

+0

Si uso la línea 'newFile.close()', aparece un error que dice que el objeto '' _csv.writer 'no tiene ningún atributo' cerrar '" – Curious2learn

0

Para un enfoque completamente diferente, consideran que Python ships with SQLite. Puede almacenar sus datos en una base de datos SQL sin agregar dependencias de terceros.

+0

Necesito usar los datos para trazar gráficos con matplotlib. Pude importar de SQlite pero parece demasiado trabajo para exportarlo e importarlo. – Curious2learn

Cuestiones relacionadas