Cómo leer y escribir datos en archivos con NumPy

Introducción

Hoy vamos a ver rápidamente cómo leer datos desde un archivo con NumPy y también cómo escribirlos. Es algo a lo que tendremos que recurrir con mucha frecuencia, ya sea porque hemos recogido nuestros datos de un experimento y los tenemos almacenados en un fichero de texto, porque los hemos recibido por otras fuentes o porque queremos separar lo que es la lógica del programa de los datos con los que opera.

Ya comentamos hace tiempo cómo crear matrices en Python a partir de listas, utilizando rangos numéricos, etc. Lo bueno que tienen las funciones de NumPy que nos ayudan a desempeñar estas tareas es que no tenemos que preocuparnos por el manejo de ficheros con Python, así que leer o escribir será tan fácil como invocar una función.

En esta entrada se ha usado python 2.7.3 y numpy 1.6.2 y es compatible con python 3.2.3

Lectura

NumPy nos ofrece varias funciones para cargar datos en forma matricial, pero la que usaremos con más frecuencia es la función loadtxt. Su único argumento obligatorio es un nombre de archivo o un objeto file desde el que leer los datos.

El comportamiento por defecto de loadtxt será:

  • Leer todas las líneas (se pueden saltar las n primeras utilizando el argumento skiprows,
  • salvo las que empiecen por # (se puede cambiar esto utilizando el argumento comments),
  • esperará que los datos estén separados por espacios (se puede cambiar utilizando el argumento delimiter),
  • y devolverá un array de NumPy de tipo float (el tipo se puede asignar con el argumento dtype).

Veamos algunos ejemplos sencillos:

In [1]: !cat matriz_a.dat # Evidentemente, tengo el archivo creado de antes... ¿magia?
1.0000e+00 2.0000e+00
-1.0000e+00 0.0000e+00
In [2]: np.loadtxt('matriz_a.dat')
Out[2]:
array([[ 1.,  2.],
[-1.,  0.]])
In [3]: !cat matriz_b.dat # Nótese la primera línea
# Datos del experimento
1.0000e+00 2.0000e+00
-1.0000e+00 0.0000e+00
In [17]: B = np.loadtxt('matriz_b.dat') # NumPy la ignora sin más
In [18]: B
Out[18]:
array([[ 1., 2.],
[-1., 0.]])

Otras funciones que también sirven para leer datos son:

  • La función load sirve para leer datos en el formato comprimido de NumPy, que suele tener las extensiones .npy o .npz.
  • La función fromfile sirve para leer datos en formato binario.
  • La función genfromtxt es mucho más flexible que loadtxt, y es crucial cuando el archivo está mal formateado o faltan valores en los datos. En la gran mayoría de los casos es suficiente con usar loadtxt.

Escritura

Ya que hemos visto cómo leer archivos con NumPy, es lógico que aprendamos también cómo guardar nuestros datos en ficheros de texto. La contrapartida de la función loadtxt para escritura es, ¡sorpresa! la función savetxt. Tiene dos argumentos obligatorios: el nombre del archivo y el array que se guardará. Su comportamiento por defecto es guardar los datos con 18 cifras decimales, pero esto se puede cambiar con el argumento fmt.

Para guardar nuestro array en un archivo, simplemente tendremos que hacer:

In [3]: A = np.array([[1, 2], [-1, 0]])
In [4]: A
Out[4]:
array([[ 1,  2],
       [-1,  0]])
In [5]: np.savetxt('matriz_a.dat', A, fmt='%.4e')
In [6]: !cat matriz_a.dat
1.0000e+00 2.0000e+00
-1.0000e+00 0.0000e+00

¡Y esto es todo por hoy! No dudes en dejarnos tus comentarios en el blog, en Twitter o en Facebook. ¡Un saludo!

Juan Luis Cano

Estudiante de ingeniería aeronáutica y con pasión por la programación y el software libre. Obsesionado con mejorar los pequeños detalles y con ganas de cambiar el mundo. Divulgando Python en español a través de Pybonacci y la asociación Python España.

More Posts - Website

Follow Me:
TwitterLinkedIn

16 thoughts on “Cómo leer y escribir datos en archivos con NumPy

  1. Pingback: Bitacoras.com
    1. Hola Pedro, solo tienes que especificar la carpeta correspondiente en el nombre del archivo, por ejemplo “carpeta1/carpeta2/archivo.txt”, o usar el módulo os.path. ¡Un saludo!

      1. Gracias. Había probado de todo, ¡y resulta que colocaba la barra inclinada “/” al revés!

  2. Hola buenas, tengo un problema he creado una lista en un archivo de texto plano algo asi [[1,2,3],[4,5,6],[7,8,9]]
    luego hago algo similar a lo que haces con loadtxt sin embargo me dice que no puedo convertir un string a flotante, luego use genfromtxt asumiendo que el formato es incorrecto pero solo me imprime nan, me podrias orientar porfavor

    1. Hola nicoveliz, si la has escrito exactamente así entonces genfromtxt no lo puede leer, o necesitaría modificar alguna opción. Es mejor que busques una manera alternativa de hacer lo que quieres. ¡Un saludo!

  3. Hola, como estás, mira tengo un array del tipo :

    [6535.0, 7750.0, 8470.0, 7663.0, 12531.0, 8165.0, 7085.0
    el mismo que le quiero salvar en un txt. Al momento de guardarlo lo hace de esta forma
    6.535000000000000000e+03
    7.750000000000000000e+03
    8.470000000000000000e+03
    7.663000000000000000e+03
    1.253100000000000000e+04
    8.165000000000000000e+03
    7.085000000000000000e+03

    probe con scipy y numpy pero el resultado es el mismo.

    Alguna sugerencia?

    Saludos

  4. Buenas noches, tengo un problema con la entrada del texto, uso
    matriz = []
    archivo = open(“ventas.txt”)
    for linea in archivo:
    matriz.append([linea.strip().split()])
    archivo.close()
    print matriz

    para que se lea un archivo .txt y cree una matriz, pero esta me queda asi:

    [[[’21’, “[’23”, ’25’, ’50’, “20′]”]], [[’35’, “[’22”, ’42’, ’22’, “25′]”]], [[’41’, “[’42”, ’43’, ’25’, “22′]”]], [[’16’, “[’15”, ’16’, ’10’, “20′]”]], [[’11’, “[’12”, ’15’, ’19’, “10′]”]]]

    asi no puedo realizar operaciones, porfavor si alguien sabe como arreglar el problema agradezco.

    1. Hola Juan David, no me queda muy claro qué quieres conseguir pero en todo caso si quieres recuperar los números lo mejor es que simplifiques la estructura de la matriz y se la pases a NumPy. Para más dudas te recomiendo ir a http://es.stackoverflow.com/. ¡Un saludo!

  5. Hola Juan
    es que tengo dificultad en poner texto dentro de una matriz (poner en un espacio caracteres alfabéticos dentro de una posición) para títulos o anotaciones. Tu sabes si esta acción se puede hacer?.

    Agradezco si me puedes ayudar

    1. Hola Isabel, leer y escribir texto con NumPy se hace muy complicado. Te recomiendo que utilices archivos CSV y que los leas con pandas si no te queda más remedio. ¡Un saludo!

  6. Hola Juan,
    Python puede leer varias matrices(o varia información) desde un solo archivo??
    quiero leer varias matrices pero solo con un archivo
    se puede??
    saludos

  7. Hola , que tal buen dia, si yo quisiera obtener datos de una imagen, ya que en mi script uso el modulo de numpy, y quisiera saber los datos de una imagen o secuencia de video, para poder extraer dicha informacion y mandarla a un servidor como Mysql

Comments are closed.