martes, 18 de octubre de 2011

Python: Como extraer datos de un archivo XLS

Esta entrada es respuesta a una pregunta hecha en Yahoo Respuestas:
¿Como extraer datos de un archivo xls en python?


Para hacer esto, primero toca descargar el módulo xlrd, de acá


Descarga librería xlrd


El cual permite cargar los datos de archivos que tengan extensión xls (no permite trabajar con xlsx), una vez descargada e instalada la librería, procedí a hacer el código, que aunque está un poco complicado y se puede optimizar, lo hice así para no demorarme, además le hice comentarios, para que se pueda estudiar más fácil:

#!/usr/bin/env python
# -*- coding: latin-1 -*-

# Las dos líneas anteriores son comentarios mágicos
# El primero para que usuarios de linux puedan ejecutar
# el script sin necesidad de buscar el compilador
# ya que esta línea se encarga de buscarlo por ellos
# y ejecuta el código con el interprete indicado.
# En unix se llama shebang, hashbang o sharpbang.

# El segundo comentario es para especificar el juego
# de caracteres que se va a utilizar en el código fuente
# permite utilizar tildes( acentos: áéíóú ) y la 'Ñ'
# para comentar y utilizarlas en cadenas (strings)
# como en la variable  campos

# La siguiente línea es para importar el módulo que
# que permitirá cargar datos de una hoja de excel
import xlrd

# Variables solicitadas por el ejercicio y otras
# que se tuvieron que adicionar para pode realizarlo
nombre1 = 'animales.xls'
nombre2 = 'personas.xls'
nombre3 = 'mezclado.txt'
campos = [ u'Apellido', u'Animal', u'Tamaño', u'Color', u'Nombre' ]
datos = []
columna = 0

# Funciones para cargar y/o abrir los archivos
# Las dos primeras son funciones que vienen con el xlrd
# básicamente lo que hacen es crear una copia del libro o
# archivo de excel, para trabajarlo localmente, con funciones
# y estructuras de datos de python, es decir, el archivo original
# solo se lee una vez para cargar todos los datos.
# La última es la función común de python para abrir archivos
archivo1 = xlrd.open_workbook( nombre1 )
archivo2 = xlrd.open_workbook( nombre2 )
archivo3 = open( nombre3, 'w' );

# Obtener la primera primera hoja de cada libro por medio del índice.
# Python cuenta desde 0 mientras que excel desde 1
hoja1A1 = archivo1.sheet_by_index(0)
hoja1A2 = archivo2.sheet_by_index(0)


# for para revisar los campos solicitados en el array campos
for dato in range( len( campos ) ):
    # Este for es para revisar cada una de las celdas
    # que se encuentran en la primera linea de cada hoja
    # para compararla con el valor del campo, y si es igual
    # añade todos los valores en un nuevo array dentro de
    # la lista datos.
    # En caso de encontrar una coincidencia entra en la condicional
    # luego añade un nuevo array a datos, carga los datos desde
    # los que se encuentran en la estructura donde se copiaron
    # los datos del archivo de excel
    # luego añade uno a la variable columna que funciona
    # como subindice
    # este for es para revisar la hoja1 del archivo 1
    for col in range( hoja1A1.ncols ):
        if hoja1A1.cell(0, col).value == campos[dato]:
            datos.append([])
            for fila in range( hoja1A1.nrows ):
                datos[columna].append( hoja1A1.cell(fila, col).value )
            columna += 1

    # Este for hace lo mismo que el anterior, pero con la
    # hoja 1 del archivo 2.  Tanto este for, como el anterior
    # se pueden implementar dentro de una función, pero yo lo hice
    # así por que solo fué copiar y pegar ::yaoming::
    for col in range( hoja1A2.ncols ):
        if hoja1A2.cell(0, col).value == campos[dato]:
            datos.append([])
            for fila in range( hoja1A2.nrows ):
                datos[columna].append( hoja1A2.cell(fila, col).value )
            columna += 1

# for para examinar el tamaño máximo de las columnas
filas = 0
for dato in range( len( datos ) ):   
    if filas < len( datos[dato] ):
        filas = len( datos[dato] )   

# Con este for recorro los primeros campos de cada columna
# y los imprimo en el archivo
# cadena_de_texto.encode('latin-1') permite grabar
# caracteres con tilde (acento) y la letra 'ñ'
# luego doy una tabulación por cada campo, y sale del for
for campo in range( len( datos ) ):
    archivo3.write( datos[campo][0].encode('latin-1') )
    archivo3.write( "\t" )

# salto de linea, y la línea para dividir el encabezado de datos
archivo3.write( "\n" )
archivo3.write( "========================================" )
archivo3.write( "\n" )

# Hago lo mismo que con los encabezados
# pero esta vez para escribir en el archivo
# cada fila
for fila in range( 1, filas ):
    # inicio en range( 1, filas) para no volver a escribir la primera línea
    for col in range( len( datos ) ):
        # con el siguiente if, evito que se pase del límite del tamaño
        # de cada columna, para ue no genere error
        if fila < len( datos[col] ):
            archivo3.write( datos[col][fila].encode('latin-1') )
            archivo3.write( "\t" )
    archivo3.write( "\n" )  

archivo3.close()


Es bueno que si no entienden algo, busquen en internet, y aunque la documentación de la librería xlrd, no está muy entendible, además solo está en ingles:


Página oficial:
http://www.lexicon.net/sjmachin/xlrd.htm


Documentación:
http://www.lexicon.net/sjmachin/xlrd.html


Explica todo lo que utiliza para funcionar.

No hay comentarios:

Publicar un comentario