2011-04-18 60 views
9

Tengo dificultades para leer un valor de celda particular de Excel en xlrd. Cualquier valor que estoy leyendo (valor de fecha) se convierte a un número. Sé que hay soluciones para convertirlo en formato de fecha python, pero ¿puedo leer directamente el valor de la cadena en xlrd?Python xlrd leer como cadena

+2

Así funciona Excel. Lamentablemente, Excel almacena muchos valores como números. Proporcione los detalles del valor de celda que está leyendo en XLRD. Imprima el tipo de celda en particular y lo incluyó en su pregunta. –

Respuesta

8

xlrd NO convierte las fechas en flotar. Excel almacena las fechas como flotantes.

Citando the xlrd documentation (desplazarse hacia abajo una página):

fechas en hojas de cálculo Excel

En realidad, no hay tales cosas. Lo que tienes son números flotantes números y esperanza piadosa. Hay varios problemas con las fechas de Excel:

(1) Las fechas no se almacenan como un tipo de datos independiente; se almacenan como números de punto flotantes y debe confiar en (a) el "formato de número" aplicado a ellos en Excel y/o (b) saber qué celdas se supone que tienen fechas en ellas. Este módulo ayuda con (a) por inspeccionando el formato que ha sido aplicado a cada celda numérica; si el parece ser un formato de fecha, la celda se clasifica como una fecha en lugar de un número .

Consulte también la sección sobre la clase Cell y los diversos métodos de hoja que extraen el tipo de celda (texto, número, fecha, booleano, etc.).

Lea también el tutorial al que puede acceder desde www.python-excel.org

+0

Me pregunto cómo sabe Excel cuando las celdas deben interpretarse como fechas: parece que xlrd está forzado a adivinar. – nobar

+0

@nobar: Excel tiene exactamente la misma información disponible que xlrd. Ambos se basan en la introspección del "formato numérico. –

+4

En realidad, los archivos Excel almacenan un tipo de celda además del valor de cada celda. Cada tipo se almacena como un entero, al que se puede acceder en xlrd con sheet.cell_type (rowNumber, columnNumber). 0 está en blanco, 1 es texto, 2 es un número, 3 es una fecha. – Brian

5

así, como usted dice:

# reading from a xls file (no .xlsx files, no writing!) 
import xlrd # install xlrd from http://pypi.python.org/pypi/xlrd 

wb = xlrd.open_workbook("YOUR_FILE.xls") # xls file to read from 
sh1 = wb.sheet_by_index(0) # first sheet in workbook 
sh2 = wb.sheet_by_name('colors') # sheet called colors 

# print all rows in first sheet 
print "content of", sh1.name # name of sheet 
for rownum in range(sh1.nrows): # sh1.nrows -> number of rows (ncols -> num columns) 
    print sh1.row_values(rownum) 

# rowx and colx (x for Excel) start at 1! 
print "row3 col 2:", sh1.cell(rowx=3,colx=2).value 

col = sh1.col_values(0) # column 0 as a list of string or numbers 
print '"A" column content:' # python index 0, 1.colunm, called A 
for cell in col: print cell 
print sh1.col_values(1) # 2. column, note mix of string (header) and numbers! 

Para este ejemplo el XLS es:

hoja 1: lista

name   latitude longitude status color date 
Mount Hood  45.3736 121.6925 active red  01-ene-01 
Mount Jefferson 44.6744 121.7978 dormant yellow 23-sep-05 
Three-Fingered 44.478 121.8442 extinct green 
Mount Washington 4.3325 121.8372 extinct green 
South Sister 44.1036 121.7681 active red 
Diamond Peak 43.5206 122.1486 extinct green 
Mount Thielsen 43.1531 122.0658 extinct green 
Mount Scott  42.923 122.0163 dormant yellow 
Mount McLoughlin 2.445 122.3142 dormant yellow 

hoja 2: colores

status color 
active red 
dormant yellow 
extinct green 
+0

Cuando hago un sh1.row_values ​​(rownum) obtengo una lista con los valores ya convertidos a coma flotante. – Rnet

4

Excel almacena las fechas como números tanto int ernally y en archivos .xls y luego los formatea adecuadamente cuando se muestran. Por lo tanto, si los lee ingenuamente con xlrd, obtendrá números o cadenas. Lo que debe hacer es verificar qué tipo de celda es y luego convertir el número usted mismo. Ya sea usando las funciones integradas xlrd, como xldate_as_tuple(), o su propia función.

Consulte this question para obtener más información.

Cuestiones relacionadas