【问题标题】:Python: lxml is not reading element text all timePython:lxml 并非一直在读取元素文本
【发布时间】:2019-12-06 10:04:00
【问题描述】:

我想将具有以下结构的 xml 文件加载到 pandas 数据帧中

xml 的大小可以在 1 GB 到 6GB 之间

下面的 xml 示例只有 5 条记录,但我的实际文件将有大约 100000 条记录,如下面的 RECORDS 属性中提到的 (RECORDS="108881")

此外,此文件中的每个元素都将具有一定的价值。 整个文件中没有一个元素是空的。

<?xml version="1.0" encoding="UTF-8"?>
<ACADEMICS>  
   <STUDENTS ASOF_DATE="11/21/2019" CREATE_DATE="11/22/2019" RECORDS="108881">      
    <STUDENT>      
        <NAME>JOHN</NAME>      
        <REGNUM>1000</REGNUM>      
        <COUNTRY>USA</COUNTRY>      
        <ID>JH1</ID>
        <SHORT_STD_DESC>JOHN IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>ADAM</NAME>      
        <REGNUM>1001</REGNUM>      
        <COUNTRY>FRANCE</COUNTRY>      
        <ID>AD2</ID>
        <SHORT_STD_DESC>ADAM IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>PETER</NAME>      
        <REGNUM>1003</REGNUM>      
        <COUNTRY>BELGIUM</COUNTRY>      
        <ID>PE5</ID>
        <SHORT_STD_DESC>PETER IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>ERIC</NAME>      
        <REGNUM>1006</REGNUM>      
        <COUNTRY>AUSTRALIA</COUNTRY>      
        <ID>ER7</ID>
        <SHORT_STD_DESC>ERIC IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
    <STUDENT>      
        <NAME>NICHOLAS</NAME>      
        <REGNUM>1009</REGNUM>      
        <COUNTRY>GREECE</COUNTRY>      
        <ID>NI8</ID>
        <SHORT_STD_DESC>NICHOLAS IS A GOOD STUDENT</SHORT_STD_DESC>
    </STUDENT>
</STUDENTS>

我正在尝试使用以下函数读取这些 xml 正如您在下面的函数中看到的,我只是对从 xml 文件中读取特定标签感兴趣,这些标签是 ["ACADEMICS","STUDENDS","ID","SHORT_STD_DESC"]

def recursive_dict(self,element):
        return element.tag, \
            dict(map(self.recursive_dict, element)) or element.text

def ConvertFilePivot(self, inputfile):        
        context = etree.iterparse(inputfile, events=('start','end'), tag=["ACADEMICS","STUDENDS","ID","SHORT_STD_DESC"])
        lstValues = []
        asOfDate = ""
        for event, elem in context:
            if elem.tag == "ACADEMICS" :
                asOfDate = elem[0].attrib['ASOF_DATE']
            else:        
                for event, elem in context:                                          
                    doc = self.recursive_dict(elem)                                   
                    lstValues.append(doc)                
                dfvalues = pd.DataFrame(lstValues,columns=["ColName","ColValue"])
                columns = dfvalues['ColName'].unique()
                data = {}
                for column in columns:
                    data[column] = list(dfvalues[dfvalues['ColName'] == column]['ColValue'])

        dfdata = pd.DataFrame(data)        
        return dfdata

现在,问题是当我将这个 xml 加载到数据帧中时,如上面的函数所示,对于某些记录,我得到“无”作为 ID 和 SHORT_STD_DESC 元素的文本。 但实际的 xml 文件具有该值。 所以我不确定为什么它没有反映在我的数据框中? 任何意见都会对我有很大帮助。

【问题讨论】:

    标签: python pandas lxml


    【解决方案1】:

    这可能更像是一个评论而不是一个答案,但我无法将它放在实际评论中......

    尝试改变

     else:        
         for event, elem in context:                                          
               doc = self.recursive_dict(elem)    
    

    只是:

     else:             
         doc = self.recursive_dict(elem)    
    

    看看它是否有效。

    【讨论】:

    • 非常感谢 Jack,这解决了我的问题。自从过去几天以来,我一直在挠头来修复它。
    猜你喜欢
    • 2023-02-21
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2021-09-21
    • 2013-06-07
    相关资源
    最近更新 更多