Использование xlrd для получения чисел с плавающей запятой из xls

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

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

Например, файл Excel имеет ячейку со значением -1.62717010683527 , затем используя
str(worksheet.cell(i,j).value) -1.62717010684 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 str(Decimal(worksheet.cell(i,j).value)) производит -1.6271701068352695095187044671547482721507549285888671875

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

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

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

g - 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" .

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

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

xlrd точно получает это значение.

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

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

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

Из одного значения с плавающей точкой 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, вам, вероятно, придется писать форматирование с нуля.

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

  • Значение первой строки python xlrd
  • openpyxl, показывающий '=' вместо формулы
  • Лучший способ создания XML для наследования xml-узла от excel
  • Python / Excel - Условная печать на ячейке с помощью xlrd
  • Запись на конкретный рабочий лист Excel с использованием python
  • новый символ строки не работает должным образом при записи из excel в текстовый файл
  • Создание словаря из книги excel в python с использованием имен листов в качестве ключа
  • Python: xlrd выдающиеся даты от поплавков
  • Добавление данных при записи из документа excel в txt
  • Python Excel анализирует данные с помощью xlrd
  • Файлы XLRD и HTTP Excel в Python
  • Давайте будем гением компьютера.