martes, 14 de junio de 2011

Leer datos de Excel con Python

Para mi PFC necesito leer datos directamente de ficheros Excel. He encontrado una librería que nos facilita la tarea: xlrd.

Dicha librería sólo sirve para tareas de lectura. Si queremos escribir existe otra equivalente, que en este caso se llama xlwt.

Ambas son compatibles con ficheros Excel 97, 2000, XP y 2003.

Para abrir una archivo de Excel, basta con hacer:

excel = xlrd.open_worbook("hoja.xls")

Ahora podemos seleccionar una hoja por su nombre:

hoja = excel.sheet_by_name("hoja 1")

Aunque también podríamos hacerlo por índices.

Dejo un ejemplo completo con las funciones más básicas:


import xlrd


''' Return a xlrd.sheet object with the Excel sheet information.
   
    Arguments:
    filename -- Location of Excel file.
    sheetname -- The name of the Excel page ie:"Testing".
'''
def open_xls(filename,sheetname):
    # Open the workbook
    wb = xlrd.open_workbook(filename,formatting_info=True)
   
    # Select the sheet
    sh = wb.sheet_by_name(sheetname)
   
    # Returns the sheet
    return sh


''' Returns a list of ParetoFront individuals fitness in with format
    [Obj1Fitness,Obj2Fitness].
   
    Arguments:
    sheet -- The Excel sheet returned from open_xls() function.
    iteration -- The iteration to obtain the Pareto Front.
'''
def get_pf(sheet,iteration):
    ind_fitness = list()
   
    # Iterate through rows
    for rownum in range(sheet.nrows):
        # Select only individuals in given iteration
        if sheet.cell_value(rownum,0) == iteration:
            # Save [Obj1NSGA2,Obj2NSGA2] of PF individuals
            if sheet.cell_xf_index(rownum,1) != sheet.cell_xf_index(rownum,2):
                ind_fitness.append([sheet.cell_value(rownum,5),sheet.cell_value(rownum,4)])
   
    return ind_fitness
           
   
def main():
    sheet = open_xls("BestsFinal.xls","Training")
    print get_pf(sheet,2)

    return 0

if __name__ == '__main__':
    main()

domingo, 12 de junio de 2011

Crear enlaces simbólicos en Windows

Para complementar la entrada anterior, comento como crear enlaces simbólicos en Windows (al parecer, este método sólo es válido con Windows Vista o 7).

Primero abrimos una consola de administrador (Inicio, escribimos cmd y con el botón derecho en el programa seleccionamos "Ejecutar como administrador").

A continuación podemos hacer el enlace, la sintaxis es:

mklink /D (directorio-destino) (directorio-enlazado)

Por ejemplo, ayer necesitaba que toda mi música estuviera disponible desde el directorio C:\jukloud\static\songs . Mi primera idea fue copiar todo mi directorio de música a dicha carpeta. Pero simplemente basta con hacer:

mklink /D C:\jukloud\static\songs "F:\Mi Musica"

Las comillas del último directorio son necesarias porque tiene espacios.

La única cosa a tener en cuenta es que el directorio destino NO debe existir previamente, ya que será creado como directorio simbólico con la orden mklink.

lunes, 6 de junio de 2011

Crear enlaces simbólicos en Linux

Hoy he actualizado Iceweasel (Firefox en Debian) a su versión 4. Firefox, sin embargo está en una versión anterior en los repositorios, por lo que mi idea ha sido borrar firefox y hacer un enlace simbólico a Iceweasel, consiguiendo así que cualquier programa que llamase a Firefox, llamase ahora a Iceweasel.

Para ello, la sintaxis es la siguiente:

sudo ln -s (origen) (destino)

Que en mi caso era:
 
sudo ln -s /usr/bin/iceweasel /usr/bin/firefox

Con esto creamos un enlace simbólico llamado firefox en /usr/bin, que es donde antes de desinstalarlo estaba el ejecutable de Firefox 3. Ahora al escribir firefox en consola, llamará al enlace, que a su vez ejecutará /usr/bin/iceweasel.

Nota: Si en algún momento queremos deshacer el enlace, bastará con ejecutar:

sudo unlink /usr/bin/firefox

jueves, 19 de mayo de 2011

Modificar tamaño de pestañas en Eclipse (Linux)

Actualmente estoy probando Linux Mint Debian Edition, y uno de los problemas que le veo (y que también me pasaba en Ubuntu, por lo que supongo que será más cosa de Gnome) es que la interfaz se come demasiado espacio de la pantalla. Sin embargo, aunque en los temas GTK+ esto se puede arreglar más o menos a base de usar temas compactos y/o modificar el tamaño de las tipografías, en programas con interfaces gráficas no nativas (por ejemplo Eclipse) no sirven estas soluciones.

He buscado y he encontrado un par de soluciones en StackOverflow y UbuntuGeek

http://ubuntuforums.org/showthread.php?t=1465712&page=2

http://stackoverflow.com/questions/2743647/gigantic-tabs-in-eclipse-on-ubuntu

Básicamente ambas consisten en crear un archivo llamado .gtkrc-2.0 en nuestra carpeta home e incluir en él lo siguiente:

GtkButton::default_border={0,0,0,0}
GtkButton::default_outside_border={0,0,0,0}
GtkButtonBox::child_min_width=0
GtkButtonBox::child_min_heigth=0
GtkButtonBox::child_internal_pad_x=0
GtkButtonBox::child_internal_pad_y=0
GtkMenu::vertical-padding=1
GtkMenuBar::internal_padding=0
GtkMenuItem::horizontal_padding=4
GtkToolbar::internal-padding=0
GtkToolbar::space-size=0
GtkOptionMenu::indicator_size=0
GtkOptionMenu::indicator_spacing=0
GtkPaned::handle_size=4
GtkRange::trough_border=0
GtkRange::stepper_spacing=0
GtkScale::value_spacing=0
GtkScrolledWindow::scrollbar_spacing=0
GtkTreeView::vertical-separator=0
GtkTreeView::horizontal-separator=0
GtkTreeView::fixed-height-mode=TRUE
GtkWidget::focus_padding=0
}
class "GtkWidget" style "gtkcompact"

Como se puede ver, el cambio es evidente:

Actualización: He estado probando y para mi gusto se queda aún mejor con lo siguiente:
style "gtkcompact" {
GtkButton::default_border={0,0,0,0}
GtkButton::default_outside_border={0,0,0,0}
GtkButtonBox::child_min_width=0
GtkButtonBox::child_min_heigth=0
GtkButtonBox::child_internal_pad_x=0
GtkButtonBox::child_internal_pad_y=0
GtkMenu::vertical-padding=0
GtkMenuBar::internal_padding=0
GtkMenuItem::horizontal_padding=4
GtkToolbar::internal-padding=0
GtkToolbar::space-size=0
GtkOptionMenu::indicator_size=0
GtkOptionMenu::indicator_spacing=0
GtkPaned::handle_size=1
GtkRange::trough_border=0
GtkRange::stepper_spacing=0
GtkScale::value_spacing=0
GtkScrolledWindow::scrollbar_spacing=0
GtkTreeView::vertical-separator=0
GtkTreeView::horizontal-separator=0
GtkTreeView::fixed-height-mode=TRUE
GtkWidget::focus_padding=0
}

Presentación

En este blog iré recopilando pequeños trucos y tutoriales para tenerlos siempre a mano y que no se pierdan con el tiempo.