Fácil guardado / carga de datos en python

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

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

Mis funciones actuales de save() y load() usan file.readline() , file.write() y conversión de cadena a flotación. Debe haber algo mejor.

Hay varias opciones, no sé exactamente lo que te gusta. Si los dos vectores tienen la misma longitud, podría usar numpy.savetxt() para guardar sus vectores, por ejemplo, x e y , como columnas:

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

Si está tratando con vectores de flotadores más grandes, probablemente debería usar NumPy de todos modos.

La forma más sencilla de obtener un resultado legible para las personas es mediante el uso de un formato de serialización como un JSON. Python contiene una biblioteca json que puede usar para serializar datos hacia y desde una cadena. Como pickle , puedes 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 recuperar una cadena simple en lugar de volcarla en un archivo, puede usar json. volcados () en su lugar:

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

Leer 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 tiene todas las funciones, por lo que recomiendo consultar la documentación para ver qué tipo de cosas puedes hacer con ella.

  • Si fuera legible para los humanos, también iría con JSON. A menos que necesite intercambiarlo con personas de tipo empresarial, a ellos les gusta XML mejor. 🙂

  • Si debería ser editable por humanos y no es demasiado complejo, probablemente optaría por algún tipo de formato similar a INI, como por ejemplo configparser.

  • Si es complejo y no es necesario intercambiarlo, me limitaría a seleccionar los datos, a menos que sea muy complejo, en cuyo caso usaría ZODB.

  • Si es un montón de datos, y necesita ser intercambiado, usaría SQL.

Eso lo cubre bastante, creo.

Un formato de serialización simple que es fácil de leer para los humanos y las computadoras es JSON .

Puedes usar el módulo json python.

Ya que estamos hablando de un humano que edita el archivo, asumo que estamos hablando de relativamente pocos datos.

¿Qué tal la siguiente implementación de esqueleto? Simplemente guarda los datos como pares key=value y trabaja 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"] 

Como comenté en la respuesta aceptada, usando numpy esto se puede hacer con una sola frase:

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

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

guardará los datos en el formato (opcional) y

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

lo cargara

El archivo xy.txt se verá así:

 # xy 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 objective es la legibilidad humana, puede resultar bastante útil. Si se usa, se especifica utilizando los códigos habituales de tipo printf (en mi ejemplo: número de coma flotante con 3 decimales).