首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析600M的大型XML文件

解析600M的大型XML文件
EN

Stack Overflow用户
提问于 2017-03-23 17:52:59
回答 2查看 422关注 0票数 0

如果有任何方法可以用unstagle /python解析XML文件(大小= 600M),请告诉我。事实上,我使用的是untangle.parse(file.xml),我得到了错误信息:进程已完成,退出代码为137

例如,有没有办法通过块或untangle.parse()函数使用的其他选项或特定的linux配置来解析这个文件?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-03-23 18:15:23

您可以使用xml模块sax(Simple API for XML)解析器。

SAX是一种基于的XML流上下文,文档以线性方式的进行处理。

当XML树消耗太多内存时,这是有利的,因为通常的DOM实现使用10字节的内存来表示1字节的。

执行以下操作的示例代码:

代码语言:javascript
复制
import xml.sax


def stream_gz_decompress(stream) : 
    dec = zlib.decompressobj(32 + zlib.MAX_WBITS)
    for chunk in stream : 
        rv = dec.decompress(chunk)
        if rv : 
            yield rv

class stream_handler(xml.sax.handler.ContentHandler) :

    last_entry = None
    last_name  = None


    def startElement(self, name, attrs) :
        self.last_name = name
        if name == 'item':
            self.last_entry = {}
        elif name != 'root' and name != 'updated' :
            self.last_entry[name] = {'attrs': attrs, 'content': ''}

    def endElement(self, name):

        if name == 'item':

            # YOUR APPLICATION LOGIC GOES HERE

            self.last_entry = None
        elif name == 'root':
            raise StopIteration

    def characters(self, content):
        if self.last_entry:
            self.last_entry[self.last_name]['content'] += content



parser = xml.sax.make_parser()
parser.setContentHandler(stream_handler())
with open(os.path.basename('FILENAME'), "rb") as local_file:
    for data in stream_gz_decompress(local_file):
            parser.feed(data)
票数 0
EN

Stack Overflow用户

发布于 2017-03-23 18:26:47

可以使用带有untangle的sax?,这意味着我通过sax加载文件并通过untangle读取它,因为我有很多使用untagle编写的代码,并且我已经开发了很长时间,我不想从头开始,谢谢

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42972563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档