jueves, 1 de septiembre de 2016

Programación Python XIV (uso de archivos)

Este es otro post dedicado a programación en Python, encontraréis todos los posts de este tipo juntos en el apartado Programación del blog. Y si queréis aprender más podéis visitar la web oficial de www.python.org

En este post vamos a ver como usar archivos desde python, crear un archivo, escribir, leer los datos contenidos, etc.




1.1 Crear un archivo y guardar datos 

En primer lugar vamos a ver como abrir un archivo, escribir datos en este archivo y finalmente cerrarlo. Mirad el siguiente ejemplo

# abrimos el archivo asignándolo a una variable
archivo=open('/home/pi/Desktop/fichero.txt','w')
# escribimos en el fichero los datos
archivo.write('Primera línea del fichero\n')
archivo.write('Segunda línea del fichero\n')
# cerramos el fichero
archivo.close()


En primer lugar hemos abierto un archivo con la función open(ubicación,modo), la función open tiene dos parámetros, el primero indica la ubicación del fichero (es muy importante poner correctamente la ruta respetando las mayúsculas y minúsculas, si el fichero no existe se creará uno nuevo), el segundo parámetro sirve para indicar el modo en que abrimos el archivo en este caso en modo escritura (w) write. Luego hemos añadido dos líneas al fichero con write(), al final de cada línea hemos añadido \n para que se produzca un salto de línea en el fichero, y finalmente hemos cerrado el archivo con close(). Es importante cerrar el archivo ya que de no hacerlo puede quedar bloqueado.

Si ahora vais a buscar el archivo en la ubicación que habéis indicado (en mi caso el escritorio) y lo ejecutáis con un programa de ficheros de texto veréis el contenido escrito. Tened en cuenta que si intentáis crear o abrir u archivo y vuestro usuario no dispone de permisos para ello, la ejecución del programa os devolverá un error. Podéis gestionar los errores tal y como vimos en el anterior post Programación Python XIII (control de excepciones).

1.2 Leer un archivo (read)

En segundo lugar vamos a ver como leer desde Pyhton la información guardada en un archivo. Fijaos en este ejemplo

# abrimos el archivo asignandolo a una variable
archivo=open('/home/pi/Desktop/fichero.txt','r')
# leemos el contenido del archivo
contenido=archivo.read()
# mostramos por pantalla el contenido
print(contenido)
# cerramos el archivo
archivo.close()

En primer lugar hemos abierto un archivo existente con la función open(ubicación, modo), el primer parámetro indica la ubicación del archivo que queremos abrir y el segundo el modo lectura (r) read. Luego hemos leído el contenido con read() asignándolo a una variable, luego la hemos mostrado por pantalla con print(), y finalmente hemos cerrado el archivo con close().

1.3 Leer un archivo línea a línea (readline)

En el siguiente ejemplo vamos a leer el archivo línea a línea

# abrimos el archivo asignandolo a una variable
archivo=open('/home/pi/Desktop/fichero.txt','r')
# leemos el contenido del archivo
contenido1=archivo.readline()
contenido2=archivo.readline()
# mostramos por pantalla el contenido
print(contenido1)
print(contenido2)
# cerramos el archivo
archivo.close()

A diferencia del ejemplo anterior en este caso hemos usado readline() para leer una a una las líneas del archivo.

1.4 Modos de archivo

En los ejemplos anteriores hemos visto como abrir un archivo en modo escritura (w), y en modo lectura (r). sin embargo existen otras opciones para la abertura de archivos mirad este cuadro


Modo Descripción
r Modo lectura
w Modo escritura
a Añadir al final de un archivo
t Modo texto (predeterminado)
b Modo binario
+ abreviación de modo r+w (lectura escritura)


Las dos primeras opciones las hemos visto en los ejemplos, pero también podemos indicar a la función open que el modo sea añadir (a), esto hace que podamos añadir datos al final de un archivo que ya contiene información.
Por defecto siempre que queremos abrir un fichero se abre en modo texto (t) que es el modo predeterminado, pero en algunos casos es posible que nos interese abrirlo en modo binario (b), esto sirve para añadir datos de flujo, como por ejemplo imágenes. En el caso de querer añadir más de un indicador de modo lo haremos usando el símbolo +. Fijaos en este ejemplo

archivo=open('/home/pi/Desktop/fichero.txt','w+b')

esto abriría un archivo en modo escritura de tipo binario. Otro ejemplo seria este

archivo=open('/home/pi/Desktop/fichero.txt','r+b')

esto abriría un archivo en modo lectura de tipo binario.

1.5 Control de errores con archivos

Es fácil obtener errores al abrir archivos, para controlar excepciones, tendréis que usar try... except, aquí tenéis en anlace a un post anterior sobre el control de errores Programación Python XIII (control excepciones).Os dejo un ejemplo de como debería quedar.

# iniciamos bloque try con el código a ejecutar
try:
    # abrimos el archivo asignandolo a una variable
    archivo=open('/home/pi/Desktop/fichero_error.txt','r')
    # leemos el contenido del archivo
    contenido=archivo.read()
    # mostramos por pantalla el contenido
    print(contenido)
    # cerramos el archivo
    archivo.close()
# iniciamos bloque except 
except IOError:
    # codigo que se ejecutara si se porduce un error al abrir el archivo
    print('No se puede abrir el archivo')

Este ejemplo muestra un error si la ruta o ubicación del archivo no es correcta o no esxiste.

1.6 Guardar estructuras de datos en un fichero (pickle.dump())

Python proporciona una herramienta para guardar directamente en un archivo una estructura de datos, para que luego la podamos recuperar directamente volcándola en la memoria, para ello tenemos que importar el módulo pickle, si no sabéis como usar módulos consultad el siguiente post Programación Python X (módulos y bibliotecas)
El módulo pickle dispone de la función dump(datos,archivo), al que le pasamos dos parámetros el primero es una variable con los datos que queremos guardar y el segundo el archivo. Aquí os dejo el siguiente ejemplo

# importamos el módulo
import pickle
# guardamos en una variable una lista compleja
lista_compleja=['texto',100,200,[10,20,30,False,'Frank']]
# abrimos un archivo para guardar los datos
fichero=open('/home/pi/Desktop/fichero_datos.txt','w+b')
# añadimos los datos al fichero
pickle.dump(lista_compleja,fichero)
# cerramos el fichero
fichero.close()

es muy importante que el modo del archivo sea binario (b), al abrir y leer en el archivo en lugar de texto, recordad que estamos guardando datos.

1.7 Recuperar estructuras de datos de un fichero (pickle.load())

La herramienta para recuperar los datos del ejemplo anterior es muy parecida, mirad este ejemplo

# importamos el módulo
import pickle
# abrimos un archivo para guardar los datos
fichero=open('/home/pi/Desktop/fichero_datos.txt','r+b')
# recuperamos los datos al fichero
nueva_lista=pickle.load(fichero)
# cerramos el fichero
fichero.close()
# mostramos el contenido recuperado
print(nueva_lista)

en este ejemplo importamos el módulo pickle, abrimos en modo lectura y binario el fichero en el que hemos guardado los datos, y luego cargamos los datos en la variable nueva_lista con la orden load() a la que le pasamos como parámetro el fichero abierto, luego cerramos el fichero y finalmente mostramos por pantalla los datos recuperados.

En este caso pickle es muy útil por ejemplo, si tenemos un programa que se ejecuta al arrancar la RaspberryPi y queremos cargar información necesaria para el funcionamiento del programa desde un fichero externo cada vez que se inicie.