2010-04-29 6 views
17

Я пытаюсь читать в файле Excel с помощью xlrd, и мне интересно, есть ли способ игнорировать форматирование ячейки, используемую в файле Excel, и просто импортировать все данные как текст?Чтение числовых данных Excel в виде текста с использованием xlrd в Python

Вот код, я использую для далеко:

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

Этого код является функциональным, но есть определенные поля, такие как почтовый индекс, которые импортируются как числа, так что они имеют десятичный ноль суффикс. Например, есть ли почтовый индекс «79854» в файле Excel, он будет импортирован как «79854.0».

Я попытался найти решение в этом xlrd spec, но не получилось.

ответ

22

Это потому, что целочисленные значения в Excel импортируются как плавающие в Python. Таким образом, sheet.cell(r,c).value возвращает поплавок. Попробуйте преобразовать значения в целые числа, но сначала убедитесь, что эти значения были целыми числами в 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 являются float с нулевой долей. Excel и его пользователи просто не имеют понятия целого в качестве отдельного типа. Целые числа, которые содержатся в некоторых записях ячейки RK в файле XLS, являются просто артефактами сериализации, а xlrd правильно преобразует их в float. –

4

Я знаю, что это не часть вопроса, но я бы избавился от raw_str и напишу прямо на ваш csv. Для большого файла (10 000 строк) это сэкономит массу времени.

Вы также можете избавиться от raw_data и просто использовать один для цикла.

 Смежные вопросы

  • Нет связанных вопросов^_^