2010-12-15 8 views
6

¿Cuál es la forma más fácil de guardar y cargar datos en python, preferiblemente en un formato de salida legible para humanos?fácil guardar/cargar datos en python

Los datos que estoy guardando/cargando consisten en dos vectores de flotantes. Idealmente, estos vectores se nombrarían en el archivo (por ejemplo, X e Y).

Mis actuales save() y load() funciones utilizan file.readline(), file.write() y la cadena-a-flotador conversión. Debe haber algo mejor.

Respuesta

5

Existen varias opciones: no sé exactamente qué es lo que te gusta.Si los dos vectores tienen la misma longitud, se puede usar numpy.savetxt() para guardar los vectores, por ejemplo x y y, como columnas:

# saving: 
f = open("data", "w") 
f.write("# x y\n")  # column names 
numpy.savetxt(f, numpy.array([x, y]).T) 
# loading: 
x, y = numpy.loadtxt("data", unpack=True) 

Si se trata de vectores de mayor tamaño de flota, que es mejor usar NumPy de todos modos.

+1

me parece numpy.savetxt toma una cadena como primer argumento. – nos

+0

@nos: Toma un nombre de archivo o un objeto de archivo. Puede ser que las versiones antiguas de NumPy solo aceptaran una cadena. Paso un objeto de archivo para poder escribir la línea de encabezado antes. –

+0

se guarda si uso f = abrir ("datos", "w +") – nos

2

Un formato de serialización sencillo que es fácil de leer para los humanos es JSON.

Puede usar el módulo json Python.

18

La forma más sencilla de obtener una salida legible para humanos es mediante el uso de un formato de serialización como JSON. Python contiene una biblioteca json que puede usar para serializar datos hacia y desde una cadena. Como pickle, puede usar esto con un objeto IO para escribirlo en un archivo.

import json 

file = open('/usr/data/application/json-dump.json', 'w+') 
data = { "x": 12153535.232321, "y": 35234531.232322 } 

json.dump(data, file) 

Si desea obtener una cadena simple de vuelta en vez de verterlos en un archivo, puede utilizar JSON. vertederos() lugar:

import json 
print json.dumps({ "x": 12153535.232321, "y": 35234531.232322 }) 

posterior de la lectura de un archivo es igual de fácil:

import json 

file = open('/usr/data/application/json-dump.json', 'r') 
print json.load(file) 

La biblioteca JSON es con todas las funciones, así que recomiendo checking out the documentation para ver qué clases de cosas que puedes hacer con eso.

7
  • Si debe ser legible, me también ir con JSON. A menos que necesite cambiarlo con personas de tipo empresarial , les gusta XML mejor. :-)

  • Si fuera humano editable y no es demasiado complejo, probablemente me vaya con algún tipo de INI-como formato, como por ejemplo ConfigParser.

  • si es complejo, y no tiene por qué ser intercambiados , me gustaría ir con sólo decapado de los datos, a menos que sea muy compleja, en cuyo caso me gustaría usar ZODB.

  • Si hay MUCHOS datos, y se necesita cambiar , usaría SQL.

Eso lo cubre, creo.

+1

¿Cumple CSV con alguno de estos requisitos? – dheerosaur

+0

CSV es un buen formato si sus datos son muy simples (es decir, tabulares) y desea poder importarlos en una hoja de cálculo. De lo contrario, es demasiado indefinido, no es fácil de leer o editar, no puede manejar datos complejos, y es un dolor si el conjunto de datos es grande. –

0

Como estamos hablando de un humano editando el archivo, supongo que estamos hablando de relativamente pocos datos.

¿Qué le parece la implementación esqueleto siguiente. Simplemente guarda los datos como key=value pares y funciona con listas, tuplas y muchas otras cosas.

def save(fname, **kwargs): 
     f = open(fname, "wt") 
     for k, v in kwargs.items(): 
     print >>f, "%s=%s" % (k, repr(v)) 
     f.close() 

    def load(fname): 
     ret = {} 
     for line in open(fname, "rt"): 
     k, v = line.strip().split("=", 1) 
     ret[k] = eval(v) 
     return ret 

    x = [1, 2, 3] 
    y = [2.0, 1e15, -10.3] 
    save("data.txt", x=x, y=y) 
    d = load("data.txt") 
    print d["x"] 
    print d["y"] 
+0

No me gusta la cosa eval, podría traer cosas dstrange al permitir que el usuario ejecute el código arbitrario –

+0

Suponiendo que sea algo simple, ast.literal_eval lo soluciona. Aunque prefiero el enfoque json. –

0

Como ya comenté en la respuesta aceptada, usando numpy esto se puede hacer con un simple de una sola línea:

Suponiendo que ha numpy importado como np (que es una práctica común),

np.savetxt('xy.txt', np.array([x, y]).T, fmt="%.3f", header="x y") 

guardará los datos en el formato (opcional) y

x, y = np.loadtxt('xy.txt', unpack=True) 

lo cargará.

El archivo xy.txt entonces contendrá:

# x y 
1.000 1.000 
1.500 2.250 
2.000 4.000 
2.500 6.250 
3.000 9.000 

Tenga en cuenta que la cadena de formato fmt=... es opcional, pero si el objetivo es humano-lectura puede resultar bastante útil. Si se usa, se especifica usando los códigos similares a printf (en mi ejemplo: número de coma flotante con 3 decimales).

Cuestiones relacionadas