Python саксофон разбор больших чисел с плавающей точкой - PullRequest
2 голосов
/ 01 февраля 2012

Хорошо, вот история. Я сохраняю большие числа с плавающей точкой в ​​файле XML. например 0,016780745002189634. Числа правильно сохраняются в файле, но когда я анализирую xml и читаю их, некоторые из них (я выделяю самые большие из них) саксофона разбивают их на два разных числа. Нравится: 0,016780 и 745002189634. Я использую кодировку UTF-8, если она имеет какое-то отношение, пробовал также iso та же проблема с разными результатами, думал. Заранее спасибо

import xml.sax
from xml.sax.saxutils import XMLGenerator
from xml.sax.xmlreader import AttributesNSImpl


floattosave = 0.016780745002189634
def xmlindex():
    logger = XMLGenerator(open('.\\a.xml','w'), 'utf-8')
    logger.startDocument()
    attrs = AttributesNSImpl({}, {})
    logger.startElementNS((None,'Articles'), 'Articles', attrs)
    attr_vals = {
        (None, 'id'): str(1)
        }
    attr_qnames = {
        (None, 'id'): 'id'
        }
    attrs = AttributesNSImpl(attr_vals, attr_qnames)
    logger.startElementNS((None, 'Article'), u'Article', attrs)
    attr_vals1 = {
    (None, 'word'): 'lalala'
    }
    attr_qnames1 = {
    (None, 'word'): 'word'}
    attrs1 = AttributesNSImpl(attr_vals1, attr_qnames1)
    logger.startElementNS((None, 'Lemma'), 'Lemma', attrs1)
    logger.characters(repr(floattosave))
    logger.endElementNS((None, 'Lemma'), 'Lemma')
    logger.endElementNS((None, 'Article'), 'Article')
    logger.endElementNS((None, 'Articles'), 'Articles')
    logger.endDocument()



class myhandler(xml.sax.ContentHandler):
        def __init__(self):
            xml.sax.ContentHandler.__init__(self)
            self.w = 0
            self.child = 0
        def startElement(self,name,attrs):
            if name == 'Article':
                self.child = 1
            if name == 'Lemma':
                self.child = 2
        def characters(self, content):
            if self.child == 2:
                print content
                a = float(content)
                print a
xmlindex()
xml.sax.parse(open('.\\a.xml'),myhandler())

Хм, я делаю что-то подобное, но для многих других элементов. Это один работает хорошо, я думаю, что где-то еще проблема. Я посмотрю на это. Вы очень помогли TKX

1 Ответ

2 голосов
/ 01 февраля 2012

Это не имеет ничего общего с тем, представляет ли текст числа с плавающей запятой или нет - парсерам XML не важно, что думает потребитель, что означает текст.

Ваша проблема задокументирована здесь .

ContentHandler.characters (content)

Receive notification of character data.

Парсер будет вызывать этот метод для отчета о каждом фрагменте символьных данных. SAX-парсеры могут возвращать все смежные символьные данные в одном чанке или могут разбивать их на несколько чанков; однако все символы в любом отдельном событии должны исходить из одного и того же внешнего объекта, чтобы локатор предоставлялполезная информация.

Вы несете ответственность за склейку кусков.В вашем обработчике startElement инициализируйте хранилище.В обработчике characters добавьте входящий чанк в свое хранилище.В обработчике endElement сделайте что-нибудь со своим хранилищем.

...