【问题标题】:XML to dictionary to DataFrame in PythonXML到Python中的字典到DataFrame
【发布时间】:2020-10-01 16:04:28
【问题描述】:

我想打印 XML 文件中的数据。为此,我创建了一个字典来解析文件。最后,我使用了一个 for 循环在一个新的 DataFrame 中打印数据。

<BREVIER>
  <BRV>
    <MONO>stuff</MONO>
    <TITD>stuff</TITD>
    <TITF>Blabla</TITF>
    <CMPD>stuff</CMPD>
    <CMPF>stuff</CMPF>
    <INDD>stuff</INDD>
    <INDF>Blablo</INDF>
    <CINDD>stuff</CINDD>
    <CINDF>stuff</CINDF>
    <POSD>stuff</POSD>
    <POSF>stuff</POSF>
    <DEL>true</DEL>
  </BRV>

等等,还有很多很多 BRV 类别。

我期望的输出:

Nom_du_medicament    Indication
Blabla               Blablo

我试过这段代码:

# encoding: utf-8

import xmltodict
import pprint
import json
import pandas as pd

with open('Brevier.xml',encoding='UTF-8','rb') as fd:
    my_dict = xmltodict.parse(fd.read(),encoding='UTF-8')
    tableau_indic=pd.DataFrame()
    for section in my_dict ['BREVIER']['BRV']:
        drugname = section.get('TITF')
        print(drugname in tableau_indic.loc(["Nom_du_medicament"]))
        drugindication = section.get('INDF')
        print(drugindication in tableau_indic.loc(["Indication"]))
print(tableau_indic)
fd.close()

我收到类型错误TypeError: unhashable type: 'list'

由于它不起作用,这是我尝试使用.loc的第二种方法:

# encoding: utf-8
import xmltodict
import pprint
import json
import pandas as pd

with open('Brevier.xml',encoding='UTF-8') as fd:
    my_dict = xmltodict.parse(fd.read(),encoding='UTF-8')
    tableau_indic=pd.DataFrame
    for section in my_dict ['BREVIER']['BRV']:
        drugname = section.get('TITF')
        print(tableau_indic.loc["Nom_du_medicament"])
        drugindication = section.get('INDF')
        print(tableau_indic.loc["Indication"])
print(tableau_indic)
fd.close()

这次我遇到了KeyError: 'Nom_du_medicament' 错误。

有没有办法避免这些错误?

【问题讨论】:

  • 为什么要麻烦所有这些转换而不是直接从 xml 文件打印?
  • 我是初学者,这是我想象中最合乎逻辑的方式。
  • 我建议您使用具有代表性的 xml 样本和该样本的预期输出来编辑您的问题,我们可以看看可以用它做什么。
  • 好的,我已经添加了一个代表性的 xml 样本以及该样本的预期输出

标签: python xml pandas dataframe


【解决方案1】:

有几种方法可以解决它,但基本上,既然您正在处理一个 xml 文件,不妨使用 xpath 之类的 xml 工具。

假设您的 xml 如下所示:

meds = """<BREVIER>
  <BRV>
    <MONO>stuff</MONO>
    <TITF>Blabla</TITF>
    <CMPD>stuff</CMPD>
    <INDF>Blablo</INDF>
    <CINDD>stuff</CINDD>
    <DEL>true</DEL>
  </BRV>
  <BRV>
    <MONO>stuff</MONO>
    <TITF>Blabla 2</TITF>
    <CMPD>stuff</CMPD>
    <INDF>Blablo 2</INDF>
    <CINDD>stuff</CINDD>
    <DEL>true</DEL>
  </BRV>
</BREVIER>"""

可以使用lxml来处理:

from lxml import etree
doc = etree.XML(meds)
print('Nom_du_medicament Indication')
for m in doc.xpath('//BRV'):
      print(m.xpath('./TITF/text()')[0], m.xpath('./INDF/text()')[0])

输出:

Nom_du_medicament Indication
Blabla Blablo
Blabla 2 Blablo 2

从这里,您可以格式化输出,将其加载到数据框或其他任何东西中。

【讨论】:

  • 您的代码似乎运行良好,但我仍然有与 XML 文件相关的最后一个错误:lxml.etree.XMLSyntaxError: Start tag expected, '&lt;' not found, line 1, column 1 这很令人困惑,因为我检查了我的文件,第一行是 &lt;Brevier&gt; 所以通常应该有不会有任何错误。
  • @marou95thebest 您的实际 xml 可能与我的问题中的示例不同,因此该错误表明 xml 的格式存在问题。有时,可以通过将doc = etree.XML(meds) 更改为doc = etree.fromstring(meds) 来解决。如果没有,你必须确保你的实际 xml 是有效的。
猜你喜欢
  • 2014-11-02
  • 1970-01-01
  • 2020-10-22
  • 2020-07-08
  • 1970-01-01
  • 2011-10-21
  • 2015-04-25
  • 2018-04-30
  • 1970-01-01
相关资源
最近更新 更多