2015-02-20 7 views
1

Мне нужно обработать большой XML-документ, для которого у меня есть несколько задач по очистке и обработке данных.Обработка таймера и XML-файлов

Базовый код, приведенный ниже, используется xml.etree.ElementTree. Поскольку файл очень большой (около 2 ГБ), я хотел бы иметь возможность регулярно печатать значение переменной аккумулятора tagCounts.

Каков самый чистый способ реализовать таймер, используя ElementTree печать каждые 3 минуты содержимого self.tagCounts?

Благодаря

import xml.etree.ElementTree as ET 
import pprint 

class TagCounter: 
    def __init__(self): 
     self.tagCounts = {} 

    def start(self, tag, attrib): 
     if tag in self.tagCounts: 
      self.tagCounts[tag] += 1 
     else: 
      self.tagCounts[tag] = 1   

    def end(self, tag): 
     pass 

    def data(self, data): 
     pass 

    def close(self): 
     return self.tagCounts 

def count_tags(filename): 
    parser = ET.XMLParser(target = TagCounter()) 
    with open(filename, mode='r') as f: 
     for line in f: 
      parser.feed(line) 
    t = parser.close() 
    return t 

if __name__ == "__main__": 
    tags = count_tags("file.osm") 
    pprint.pprint(tags) 

ответ

0

Что такое чистый способ реализовать таймер, используя ElementTree печать каждые 3 минуты содержание self.tagCounts?

Я не вижу, что ElementTree имеет отношение к реализации таймера:

class TagCounter: 
    def __init__(self): 
     self.tag_counts = {} 
     self.cancel_print = call_repeatedly(3*60, pprint.pprint, self.tag_counts) 

    # ... 

    def close(self): 
     self.cancel_print() 
     return self.tag_counts 

где call_repeatedly(interval, function, *args) calls function(*args) every interval seconds.

+0

спасибо @ j-f-sebastian за ваш ответ, к сожалению, это немного запутывает меня, реализация «ElementTree» в моем примере - это подход, основанный на событиях, из-за большого размера файла. Моя идея - регулярно печатать журнал на консоли, я не понимаю, как ваш код может мне помочь. Могу ли я попросить вас уточнить немного больше? Ваше предложение было бы окончательно полезным в случае разбора, основанного не на событии. – Michael

+0

@Michael: Я обновил ответ, чтобы показать, что код переходит в * ваш * 'класс TagCounter' – jfs