Python: lxml 并非一直在读取元素文本
Python: lxml is not reading element text all time
我想将具有以下结构的 xml 文件加载到 pandas 数据帧中
xml 的大小可能在 1 GB 到 6GB 之间
下面的 xml 示例只有 5 条记录,但我的实际文件将有大约 100000 条记录,如下面的 RECORDS 属性 (RECORDS="108881")
此外,此文件中的每个元素都将具有一定的价值。
None 元素在整个文件中为空。
<?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>
我正在尝试使用 lxml 阅读这些 xmls,如下所示
正如您在下面的函数中看到的,我只对从 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 加载到数据框中时,如上面的函数所示,对于某些记录,我得到 'None' 作为 ID 和 SHORT_STD_DESC 元素的文本。
但实际的 xml 文件具有该值。
所以我不确定为什么它没有反映在我的数据框中?
任何输入都会对我有很大帮助。
这可能更像是评论而不是答案,但我无法将其放入实际评论中...
尝试更改
else:
for event, elem in context:
doc = self.recursive_dict(elem)
只是:
else:
doc = self.recursive_dict(elem)
看看它是否有效。
我想将具有以下结构的 xml 文件加载到 pandas 数据帧中
xml 的大小可能在 1 GB 到 6GB 之间
下面的 xml 示例只有 5 条记录,但我的实际文件将有大约 100000 条记录,如下面的 RECORDS 属性 (RECORDS="108881")
此外,此文件中的每个元素都将具有一定的价值。 None 元素在整个文件中为空。
<?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>
我正在尝试使用 lxml 阅读这些 xmls,如下所示 正如您在下面的函数中看到的,我只对从 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 加载到数据框中时,如上面的函数所示,对于某些记录,我得到 'None' 作为 ID 和 SHORT_STD_DESC 元素的文本。 但实际的 xml 文件具有该值。 所以我不确定为什么它没有反映在我的数据框中? 任何输入都会对我有很大帮助。
这可能更像是评论而不是答案,但我无法将其放入实际评论中...
尝试更改
else:
for event, elem in context:
doc = self.recursive_dict(elem)
只是:
else:
doc = self.recursive_dict(elem)
看看它是否有效。