Использование xlrd для получения чисел с плавающей точкой из xls - PullRequest
1 голос
/ 28 марта 2012

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

Я попытался использовать repr, как предложено в https://stackoverflow.com/a/3481575/1296490, но это все равно дает точность, отличную от той, которую я хочу.

Например, файл Excel имеет ячейку со значением -1.62717010683527, затем использование
str(worksheet.cell(i,j).value) возвращает -1.62717010684,
, в то время как repr( worksheet.cell(i,j).value) возвращает -1.6271701068352695.
Использование str(Decimal(worksheet.cell(i,j).value)) производит -1.6271701068352695095187044671547482721507549285888671875

Ничто из перечисленного не дает мнеисходное значение из Excel.Я должен обработать много таких чисел, каждое с разным количеством цифр после точки, и это не подходит для использования %.10f и т. Д.

Ответы [ 4 ]

4 голосов
/ 28 марта 2012

Точность в Excel ограничена 15 значащими цифрами.

Используйте str( "%0.15g" % cell.value ) для достижения желаемого:

г - Same as "e" if exponent is greater than -4 or less than precision, "f" otherwise.
(http://docs.python.org/release/2.4.4/lib/typesseq-strings.html)

Не забудьте 0. в "%0.15".

2 голосов
/ 30 марта 2012

В своих вычислениях Excel использует 64-битную стандартную IEEE с плавающей точкой. Однако он бездействует, пытаясь сделать вид, что использует десятичную с плавающей точкой с точностью до 15 десятичных знаков.

«оригинальная ценность из excel» - очень туманная концепция. Похоже, вы хотите, что Excel показывает вам. Это НЕ , что он помещает в файл. То, что он помещает в файл, является стандартным 64-разрядным двоичным значением IEEE с плавающей запятой.

xlrd точно возвращает это значение.

Repr Python предоставляет точное строковое представление этого значения в извлекаемой форме ... float(repr(value)) == value абсолютно гарантировано.

Использование str(value) теряет точность.

Использование десятичного числа. Десятичное число с более чем 17 значащими десятичными цифрами не имеет смысла.

0 голосов
/ 29 октября 2013

Я ответил ссылкой на код (используя числовой формат для преобразования числа в строку, как это делает Excel) здесь: https://stackoverflow.com/a/19661081/327725

0 голосов
/ 28 марта 2012

Только из значения с плавающей запятой Python (или любая другая программа) не может определить желаемую точность отображения, поэтому сначала вы должны выяснить, сколько мест вы хотите показать, например, путем анализа строки формата числа Excel (возможно, «0,00000»).-> 5 знаков после запятой)

Отправной точкой для получения числового формата может быть http://groups.google.com/group/python-excel/browse_thread/thread/2d07febfa031dfa5

После того, как вы определили количество мест, которые хотите показать, вы можете использовать два аргументаформа форматирования строки

value = -1.6271701068352695   # value stored ( not displayed ) in excel
precision = 5    # to be found out from excel number format
print '%.*f' % (precision, value)

К сожалению, форматирование в произвольные форматы Excel затруднительно, поэтому, если форматирование более сложное, чем 0,0000 .... 0, вам, вероятно, придется писать форматтер с нуля.

...