Python вставляет двоеточие в десятичное число из Access через pyodbc
у меня естьта же проблема, что и у этого парня и, возможно,этот пареньЯ собираюсь поделиться кодом и ответить на вопросы!
У меня есть некоторый код в пакетном задании, которое читает поля из базы данных Microsoft Access через pyodbc и подготавливает вывод для отображения.
Вот фрагмент. Обратите внимание на утверждение.
def format_currency(amount):
if amount is None:
return ""
else:
result = "$%.2f" % amount
assert ":" not in result, (
"That's weird. The value %r of class %s is represented as %s" %
(amount, amount.__class__, result))
return result
Когда я запускаю его, он успешно обрабатывает 100 000 строк, а затем завершается ошибкой:
AssertionError: That's weird. The value Decimal('54871.0000') of class is represented as $54870.:0
Обратите внимание на аберрантную кишку. Это происходит редко - примерно один раз в 300 000 записей.
Когда я пытаюсь изолировать это, конечно, это работает.
from decimal import Decimal
print "$%.2f" % Decimal('54871.0000')
$ 54871,00
Тип поля в Access:
Тип данных: валютаДесятичные знаки: 2Маска ввода:Значение по умолчанию:Правило проверки:Выравнивание текста: общееМое смутное подозрительное подозрение основано на недостаточных доказательствах: pyodbc ковыряется во внутренностях Decimal, возможно, в замешательстве из-за повреждения Access. Как @ecatmurуказывает на то:':'
это 9 +1 в ASCII
Кто-нибудь видел это и решил?
Версии:
Python 2.7.4pyodbc 3.0.6 (последняя версия)Access 2010Windows 7Копаем дальше:
decimal
Модуль реализован на Python. Из моего чтения значения описываются четырьмя атрибутами:,,,_exp
_int
_sign
_is_special
Заподозрив коррупцию, я распечатал значения этих полей.
Удивительно, но дляи то и другое Неисправную и рабочую версию я получаю:
_exp: -4
_int: 548710000
_sign: 0
_is_special: False
Тот'странно
вdecimal
модуль,__float__
Функция определяется довольно просто:
def __float__(self):
"""Float representation."""
return float(str(self))
Но когда я делаю это с плохими данными:
print "Str", str(amount)
print "Float", float(amount)
Я получил:
Ул 54871,0000
Поплавок 54870 .:
Чем больше я учусь, тем менее страннымне получить.