2010-04-29 2 views
17

xlrd를 사용하여 Excel 파일을 읽으려고합니다. Excel 파일에서 사용되는 셀 서식을 무시하고 모든 데이터를 다음과 같이 가져 오는 방법이 있는지 궁금합니다. 본문? 여기 파이썬에서 xlrd를 사용하여 숫자 엑셀 데이터를 읽음

내가 지금까지에 대한 사용하고있는 코드입니다 :

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

이 코드는 작동하지만, 같은 숫자로 가져 우편 번호와 같은 특정 필드이있다, 그래서 그들은 소수 제로가 접미사. 예를 들어 Excel 파일에 '79854'의 우편 번호가 있으면 '79854.0'으로 가져옵니다.

나는이 xlrd spec에서 해결책을 찾으려고했지만 실패했습니다.

답변

22

Excel의 정수 값을 Python에서 부동 소수로 가져 오기 때문에 그 때문입니다. 따라서 sheet.cell(r,c).value은 float를 반환합니다. 반드시 그 값은 Excel의 정수로 시작하는 한 정수로 값을 변환하려고하지만 먼저 확인 : 그것은

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) 

xlrd spec에서 전부입니다.

+4

xlrd는 발견 한 내용을보고합니다. Excel의 유일한 "정수 값"은 소수부가 0 인 부동 소수점입니다. Excel과 그 사용자는 정수의 개념을 별도의 유형으로 가지고 있지 않습니다. XLS 파일의 일부 RK 셀 레코드에 포함 된 정수는 직렬화의 아티팩트 일 뿐이며 xlrd는이를 올바르게 float로 변환합니다. –

4

나는 이것이 질문의 일부가 아니라는 것을 알고 있지만 raw_str을 없애고 csv에 직접 쓸 것입니다. 큰 파일 (10,000 행)의 경우, 이것은 많은 시간을 절약 할 것입니다.

또한 raw_data을 없애고 하나의 루프 만 사용하면됩니다.

관련 문제