2010-04-29 41 views
17

Estoy tratando de leer en un archivo Excel usando xlrd, y me pregunto si hay una manera de ignorar el formato de celda utilizado en el archivo Excel, e importar todos los datos como ¿texto?Lectura de datos numéricos de Excel como texto usando xlrd en Python

Aquí está el código que estoy utilizando para el momento:

import xlrd 

xls_file = 'xltest.xls' 
xls_workbook = xlrd.open_workbook(xls_file) 
xls_sheet = xls_workbook.sheet_by_index(0) 

raw_data = [['']*xls_sheet.ncols for _ in range(xls_sheet.nrows)] 
raw_str = '' 
feild_delim = ',' 
text_delim = '"' 

for rnum in range(xls_sheet.nrows): 
    for cnum in range(xls_sheet.ncols): 
     raw_data[rnum][cnum] = str(xls_sheet.cell(rnum,cnum).value) 

for rnum in range(len(raw_data)): 
    for cnum in range(len(raw_data[rnum])): 
     if (cnum == len(raw_data[rnum]) - 1): 
      feild_delim = '\n' 
     else: 
      feild_delim = ',' 
     raw_str += text_delim + raw_data[rnum][cnum] + text_delim + feild_delim 

final_csv = open('FINAL.csv', 'w') 
final_csv.write(raw_str) 
final_csv.close() 

Este código es funcional, pero hay ciertos campos, como por ejemplo un código postal, que se importan como números, por lo que tienen el cero decimal sufijo. Por ejemplo, si hay un código postal de '79854' en el archivo Excel, se importará como '79854.0'.

He intentado encontrar una solución en este xlrd spec, pero no tuvo éxito.

Respuesta

22

Esto se debe a que los valores enteros en Excel se importan como flotantes en Python. Por lo tanto, sheet.cell(r,c).value devuelve un flotador. Intentan convertir los valores en números enteros, pero primero asegúrese de que esos valores se enteros en Excel para empezar:

cell = sheet.cell(r,c) 
cell_value = cell.value 
if cell.ctype in (2,3) and int(cell_value) == cell_value: 
    cell_value = int(cell_value) 

Se es todo en la xlrd spec.

+4

xlrd informa de lo que encuentra. Los únicos "valores enteros" en Excel son flotantes con una parte de fracción cero. Excel y sus usuarios simplemente no tienen el concepto de un entero como un tipo separado. Los enteros que están contenidos en algunos registros de celda RK en un archivo XLS son simplemente artefactos de la serialización y xlrd los convierte correctamente en flotantes. –

4

Sé que esto no es parte de la pregunta, pero me deshace de raw_str y escribo directamente en su csv. Para un archivo grande (10,000 filas) esto ahorrará mucho tiempo.

También puede deshacerse de raw_data y simplemente usar uno para el ciclo.

Cuestiones relacionadas