【问题标题】:Timer and XML file processing定时器和 XML 文件处理
【发布时间】:2015-04-22 00:21:07
【问题描述】:

我必须处理一个大型 XML 文档,我有几个数据清理和操作任务要做。

下面的基本代码使用xml.etree.ElementTree。 由于文件非常大(大约 2Gb),我希望能够定期打印我的 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)

【问题讨论】:

    标签: python xml multithreading python-2.7 python-3.x


    【解决方案1】:

    使用 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.

    【讨论】:

    • 感谢@j-f-sebastian 的回复不幸的是这让我有点困惑,在我的示例中,ElementTree 的实现是一种基于事件的解析方法,因为文件很大。我的想法是定期在控制台上打印日志,我不明白您的代码如何帮助我。我可以请您详细说明一下吗?在基于非事件的解析的情况下,您的建议绝对有用。
    • @Michael:我已经更新了答案以显示代码转到 yours class TagCounter
    猜你喜欢
    • 2017-05-04
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多