高效解析大型XML文件

2024-09-30 22:11:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理4GB+大小的XML文件,想知道如何最好地解析它们。现在我遇到了内存问题,正在寻找一种方法来避免将整个文件加载到内存中并成批处理它?在

当前代码正在使用lxml并在重复元素上迭代。名称空间预先清理:

from lxml import etree, objectify
import pandas as pd

file = 'some_huge_file.xml'
if file.lower().endswith('.xml'):

    parser = etree.XMLParser(remove_blank_text=True)
    tree = etree.parse(mvnFile, parser)
    root = tree.getroot()

    ####
    for elem in root.getiterator():
        if not hasattr(elem.tag, 'find'): continue  # (1)
        i = elem.tag.find('}')
        if i >= 0:
            elem.tag = elem.tag[i + 1:]
    objectify.deannotate(root, cleanup_namespaces=True)
    ####
    data = [{
        'Element1': tp.findtext('element1'),
        'Element2': tp.findtext('element2'),
        'Element3': tp.findtext('element3'),
    }
        for tp in tree.xpath('//mainelement/subelement')]

     df = pd.DataFrame(data)
print(df)

此外,我需要对元素的值进行一些拆分,因为它们是空间分隔的。但是,我只需要特定的值,所以我想知道是否可以在解析过程中这样做,而不是在空间上拆分列?在

xml示例:

^{pr2}$

Tags: 文件内存tree元素iftag空间root
1条回答
网友
1楼 · 发布于 2024-09-30 22:11:57

根据您在评论中发布的链接,我提出了以下建议,以便更有效地进行迭代和拆分,效果很好:

from lxml import etree, objectify
import pandas as pd

file = 'some_huge_file.xml'

time = []
data1_element1_x = []
data1_element1_y = []
data1_element2_x = []
data1_element2_y = []
data2_element1_x = []
data2_element1_y = []
data2_element2_x = []
data2_element2_y = []

if file.lower().endswith('.xml'):
    for event, elem in etree.iterparse(file):
        if elem.tag == "subelement":
            time.append(elem.get('tc'))
            for child in elem:
                if child.tag == "element1":
                    split_data = child.text.split(" ")
                    data1_element1_x.append(float(split_data[0]))
                    data1_element1_y.append(float(split_data[1]))
                    data2_element1_x.append(float(split_data[2]))
                    data2_element1_y.append(float(split_data[3]))
                elif child.tag == "element2":
                    split_data = child.text.split(" ")
                    data1_element2_x.append(float(split_data[0]))
                    data1_element2_y.append(float(split_data[1]))
                    data2_element2_x.append(float(split_data[2]))
                    data2_element2_y.append(float(split_data[3]))
             elem.clear()
df = pd.DataFrame({
    'Time':time, 
    'Data1_element1_x': data1_element1_x, 
    'Data1_element1_y': data1_element1_y, 
    'Data1_element2_x': data1_element2_x, 
    'Data1_element2_y': data1_element2_y, 
    'Data2_element1_x': data2_element1_x, 
    'Data2_element1_y': data2_element1_y, 
    'Data2_element2_x': data2_element2_x, 
    'Data2_element2_y': data2_element2_y
})

print(df)

相关问题 更多 >