2010-04-29 11 views
17

Próbuję odczytać w pliku Excel przy użyciu xlrd, i zastanawiam się, czy istnieje sposób, aby zignorować formatowanie komórek używane w pliku Excel, i po prostu zaimportować wszystkie dane jako tekst?Czytanie liczbowych danych Excela jako tekstu przy użyciu xlrd w Pythonie

Oto kod używam za daleko:

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

Kod ten jest funkcjonalny, ale istnieją pewne obszary, takie jak kod pocztowy, które są importowane w postaci liczb, więc mają zero dziesiętny przyrostek. Na przykład, istnieje kod pocztowy "79854" w pliku Excel, zostanie zaimportowany jako "79854.0".

Próbowałem znaleźć rozwiązanie w tym xlrd spec, ale nie udało się.

Odpowiedz

22

To dlatego, że wartości całkowite w programie Excel są importowane jako obiekty pływające w języku Python. Tak więc, sheet.cell(r,c).value zwraca wartość zmiennoprzecinkową. Spróbuj konwersji wartości do liczb całkowitych, ale najpierw upewnij się, że wartości te były liczbami całkowitymi w programie Excel, aby rozpocząć:

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) 

To jest wszystkim w xlrd spec.

+4

xlrd zgłasza, co znajduje. Jedynymi "wartościami całkowitymi" w Excelu są zmiennoprzecinkowe z częścią zerową. Excel i jego użytkownicy po prostu nie mają pojęcia liczby całkowitej jako oddzielnego typu. Liczby całkowite, które są zawarte w niektórych rekordach komórek RK w pliku XLS, są jedynie artefaktami serializacji, a xlrd poprawnie konwertuje je na zmienne. –

4

Wiem, że to nie jest część pytania, ale chciałbym pozbyć się raw_str i napisać bezpośrednio do pliku CSV. W przypadku dużego pliku (10 000 wierszy) zaoszczędzi to mnóstwo czasu.

Możesz także pozbyć się raw_data i użyć tylko jednej pętli for.

Powiązane problemy