2008-09-23 16 views
11

Mi problema es a continuación, pero estaría interesado comentarios de cualquier persona con experiencia con xlrd.¿Cómo leo un archivo de Excel en Python usando xlrd? ¿Puede leer los formatos de Office más nuevos?

Acabo de encontrar xlrd y parece ser la solución perfecta, pero estoy teniendo un pequeño problema para empezar. Estoy intentando extraer datos programáticamente de un archivo de Excel que extraje de Dow Jones con los componentes actuales del Dow Jones Industrial Average (enlace: http://www.djindexes.com/mdsidx/?event=showAverages)

Cuando abro el archivo sin modificaciones recibo un desagradable error BIFF (formato binario no reconocida)

Sin embargo se puede ver en la captura de pantalla que Excel 2008 para Mac cree que está en formato 'Excel 1997-2004' (captura de pantalla: http://skitch.com/alok/ssa3/componentreport-dji.xls-properties)

Si en lugar de abrirlo en Excel manualmente y guardar como ' Formato Excel 1997-2004 'explícitamente, luego abierto en python usig xlrd, todo es maravilloso. Recuerde, Office cree que el archivo ya está en formato 'Excel 1997-2004'. Todos los archivos son .xls

Aquí está un Pastebin de una sesión ipython replicar el tema: http://pastie.textmate.org/private/jbawdtrvlrruh88mzueqdq

Alguna idea sobre: ​​ cómo engañar a XLRD a reconocer el archivo para que pueda extraer datos? ¿Cómo se usa Python para automatizar el formato explícito 'guardar como' en uno que xlrd aceptará? Plan B?

Respuesta

0

Bueno aquí es un código que lo hice: (mira hacia abajo la parte inferior): here

No estoy seguro sobre los nuevos formatos - si XLRD no puede leerlo, XLRD necesita tener una nueva versión liberada!

-1

¿Tienes que usar xlrd? Acabo de descargar 'ACTUALIZACIÓN - Dow Jones Industrial Average Movers - 2008' de ese sitio web y no tuve problemas para leerlo con pyExcelerator.

import pyExcelerator 
book = pyExcelerator.parse_xls('DJIAMovers.xls') 
+0

nop no casada con XLRD. echando un vistazo a pyExcelerator ahora ... –

+0

Parece que no hay mucha documentación disponible para pyExcelerator. ¿Podría mostrarme los conceptos básicos de abrir un archivo y extraer datos? –

1

Más información sobre pyExcelerator: Para leer un archivo, haga lo siguiente:

import pyExcelerator 
book = pyExcelerator.parse_xls(filename) 

donde fichero es una cadena que es el nombre del archivo a leer (no es un objeto de fichero). Esto le dará una estructura de datos que representa el libro de trabajo: una lista de pares, donde el primer elemento del par es el nombre de la hoja de trabajo y el segundo elemento es la información de la hoja de trabajo.

La hoja de cálculo es un diccionario, donde las claves son (fila, col) pares (comenzando con 0) y los valores son los contenidos de la celda, generalmente int, float o string. Así, por ejemplo, en el caso simple de todos los datos que se están en la primera hoja:

data = book[0][1] 
print 'Cell A1 of worksheet %s is: %s' % (book[0][0], repr(data[(0, 0)])) 

Si la celda está vacía, que obtendrá un KeyError. Si se trata de fechas, pueden pueden (se me olvida) aparecer como enteros o flotantes; si este es el caso, necesitarás convertir. Básicamente, la regla es: datetime.datetime (1899, 12, 31) + datetime.timedelta (days = n) pero puede estar desactivada en 1 o 2 (porque Excel trata 1900 como un año bisiesto para la compatibilidad con Lotus, y porque No puedo recordar si 1900-1-1 es 0 o 1), así que haga un poco de prueba y error para verificar. Los horarios se almacenan como flotadores, creo (días y fracciones de un día).

Creo que hay soporte parcial para las fórulas, pero no le garantizo nada.

+3

pyExcelerator tiene una serie de errores conocidos: el tenedor 'xlrd' es compatible y se mantiene. – mikemaccana

3
apoyo

XLRD de formato de Office 2007/2008 (OpenXML) es en la prueba de alfa - vea el siguiente mensaje en el grupo de noticias pitón-excel: http://groups.google.com/group/python-excel/msg/0c5f15ad122bf24b?hl=en

+1

John Machin ha publicado esto públicamente (a la lista de correo) y ha expresado planes concretos para integrarlo en una nueva versión completa de xlrd a finales de año. –

+0

Esto se ha publicado hace unos días en v0.8: https://groups.google.com/forum/?fromgroups#!topic/python-excel/w2AoQkX3TZc[1-25] – RuiDC

26

Fwiw, yo soy el autor de XLRD, y el mantenedor de xlwt (un tenedor de pyExcelerator). Algunos puntos:

  1. El archivo ComponentReport-DJI.xls está mal llamado; no es un archivo XLS, es un archivo de valores separados por tabuladores. Ábrelo con un editor de texto (por ejemplo, el Bloc de notas) y verás a qué me refiero. También puede mirar los bytes sin formato no muy crudos con Python:

    >>> open('ComponentReport-DJI.xls', 'rb').read(200) 
    'COMPANY NAME\tPRIMARY EXCHANGE\tTICKER\tSTYLE\tICB SUBSECTOR\tMARKET CAP RANGE\ 
    tWEIGHT PCT\tUSD CLOSE\t\r\n3M Co.\tNew York SE\tMMM\tN/A\tDiversified Industria 
    ls\tBroad\t5.15676229508\t50.33\t\r\nAlcoa Inc.\tNew York SE\tA' 
    

    Usted puede leer este archivo usando el módulo de Python csv ... sólo tiene que utilizar delimiter="\t" en su llamada a csv.reader().

  2. xlrd pueden leer cualquier archivo que pyExcelerator pueda, y leerlos mejor — las fechas no aparecen como flotadores, y la historia completa en las fechas de Excel se encuentra en la documentación xlrd.

  3. pyExcelerator es abandware — xlrd y xlwt están vivos y en buen estado. Salida http://groups.google.com/group/python-excel

HTH John

Cuestiones relacionadas