从Python/Element树中的300MG Xml中删除元素

从Python/Element树中的300MG Xml中删除元素,python,xml,parsing,elementtree,removechild,Python,Xml,Parsing,Elementtree,Removechild,我正试图在ElementTree中解析一个300MB的XML,基于类似的建议 给予 removed <Element 'HistoryNote' at 0x557cc7f0> removed <Element 'DateCreated' at 0x557fa990> removed <Element 'HistoryNote' at 0x55809af0> removed <Element 'DateCreated' at 0x5580f5d0>

我正试图在ElementTree中解析一个300MB的XML,基于类似的建议

给予

removed <Element 'HistoryNote' at 0x557cc7f0>
removed <Element 'DateCreated' at 0x557fa990>
removed <Element 'HistoryNote' at 0x55809af0>
removed <Element 'DateCreated' at 0x5580f5d0>
已删除
远离的
远离的
远离的
然而,这只是继续,文件没有变小,检查时元素仍然存在。尝试了e.clear()或elem.remove(e),但结果相同。问候

更新 我对@alexanderlukanin13答案的第一次评论中的错误代码:


回溯(最近一次调用):文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.20150413356\pysrc\pydevd.py”,第1570行,在跟踪调度回溯(最近一次调用):文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.0.20150413356\pysrc\pydev.pydev.py”,第2278行,在globals=debugger.run(安装程序['file'],None,None)文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.20150413356\pysrc\pydevd.py”,第1704行,在运行pydev_imports.exefile(文件,全局,局部)时执行脚本文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.0.0.201504133356\pysrc\runfiles.py()”,第234行,主文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.20150413356\pysrc\runfiles.py”,在主返回pydev_runfiles.main(配置)中的第78行,注意:仍然没有返回正确的值。文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.20150413356\pysrc\pydev\pydev\pydev_runfiles\pydev运行文件,在主运行程序中的第835行(配置).run_tests()文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.20150413356\pysrc\pydev_runfiles.py”,第762行,在run_测试文件_和_modules_和_modules_name=self中。从_文件(文件)文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_运行文件中查找_模块“,第517行,在从文件mod=self查找模块。从文件str获取模块(导入,打印异常,pyfile)文件“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev\u 4.0.0.20150413356\pysrc\pydev\u runfiles.py”,第476行,从文件str获取模块(保持原始值为True,std='str')“C:\Users\Eddie\Downloads\eclipse\plugins\org.python.pydev_4.0.0.20150413356\pysrc\pydevd_io.py”,StartRedirect import sys MemoryError

中的第72行,脚本中的主要问题是没有将修改后的XML保存回磁盘。需要存储对根元素的引用,然后调用:


注意:这里我使用了一种笨拙(可能不安全)的方法来获取根元素-我假设它总是
iterparse
输出中的最后一个元素。如果有人知道更好的方法,请告诉我。

“文件没有变小。”“-为什么会这样?您正在更改内存中的对象,这不会更改文件。而且300MB也没有那么大。非常感谢@AlexanderLukani13。这就是我想要的。在Eclipse中尝试了两次:第一次尝试了20m,并给出了内存错误(如下所示),第二个崩溃的Python。桌面是一个16GB的四核3.4GHz。我们非常感谢您提供更多的见解。@user2422819 DOM解析注定会消耗大量内存,最终在某些XML大小上会失败。但坦率地说,我没想到会在300MB上失败。1)尝试从命令行运行它,可能是Eclipse +调试器干扰2)考虑移动到内存需求低的内存。可以开始并自定义它以支持嵌套元素逻辑。
removed <Element 'HistoryNote' at 0x557cc7f0>
removed <Element 'DateCreated' at 0x557fa990>
removed <Element 'HistoryNote' at 0x55809af0>
removed <Element 'DateCreated' at 0x5580f5d0>
from xml.etree import ElementTree as Et

context = Et.iterparse('input.xml')
root = None
for event, elem in context:
    if elem.tag == 'DescriptorRecord':
        for e in list(elem.getchildren()):  # Don't use _children, it's a private field
            if e.tag in ['DateCreated', 'Year', 'Month', 'TreeNumber', 'HistoryNote', 'PreviousIndexing']:
                elem.remove(e)  # You need remove(), not clear()
    root = elem

with open('output.xml', 'wb') as file:
    Et.ElementTree(root).write(file, encoding='utf-8', xml_declaration=True)