Чтение числовых данных Excel как текст с помощью xlrd в Python

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

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

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

Этот код функционален, но существуют определенные поля, такие как почтовый индекс, которые импортируются как числа, таким образом, у них есть десятичный нулевой суффикс. Например, есть ли существует почтовый индекс '79 854' в файле Excel, он будет импортирован как '79 854,0'.

Я попытался найти решение в этой xlrd спецификации, но было неудачно.

17
задан ktdrv 23 November 2015 в 00:05
поделиться

2 ответа

Это потому, что целочисленные значения в 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 .

23
ответ дан 30 November 2019 в 12:57
поделиться

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

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

4
ответ дан 30 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: