2010-04-29 14 views
17

Ich versuche, eine Excel-Datei mit XLDR zu lesen, und ich frage mich, ob es eine Möglichkeit gibt, die Zellformatierung in Excel-Datei zu ignorieren, und importieren Sie alle Daten als Text? HierLesen numerischer Excel-Daten als Text mit xlrd in Python

ist der Code, den ich für weit bin mit:

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() 

Dieser Code ist funktional, aber es gibt bestimmte Felder, wie eine Postleitzahl, die als Zahlen importiert werden, so dass sie die Dezimalstelle Null Suffix. Gibt es beispielsweise in der Excel-Datei eine Postleitzahl '79854', wird diese als '79854.0' importiert.

Ich habe versucht, eine Lösung in diesem xlrd spec zu finden, war aber nicht erfolgreich.

Antwort

22

Das liegt daran, dass Integer-Werte in Excel als Gleitkommazahlen in Python importiert werden. Somit gibt sheet.cell(r,c).value einen Gleitkommawert zurück. Versuchen Sie, die Werte auf ganze Zahlen konvertieren, aber zuerst sicherstellen, dass mit diesen Werten wurden ganze Zahlen in Excel beginnen:

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) 

Es ist alles in der xlrd spec.

+4

xlrd meldet, was es findet. Die einzigen "ganzzahligen Werte" in Excel sind Gleitkommazahlen mit einem Nullbruchteil. Excel und seine Benutzer haben einfach nicht das Konzept einer Ganzzahl als separaten Typ. Die Ganzzahlen, die in einigen RK-Zelleneinträgen in einer XLS-Datei enthalten sind, sind lediglich Artefakte der Serialisierung, und xlrd konvertiert sie korrekt in Gleitkommazahlen. –

4

Ich weiß, das ist nicht Teil der Frage, aber ich würde raw_str loswerden und direkt auf Ihre CSV schreiben. Bei einer großen Datei (10.000 Zeilen) sparen Sie viel Zeit.

Sie können auch raw_data loswerden und nur eine für die Schleife verwenden.