XML для преобразования словаря в фрейм данных в Python

#python #xml #pandas #dataframe

#python #xml #панды #фрейм данных

Вопрос:

Я хочу распечатать данные из XML-файла. Для этого я создал словарь для анализа файла. Наконец, я использовал цикл for для печати данных в новом фрейме данных.

 <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' ошибка.

Есть ли способ избежать этих ошибок?

Комментарии:

1. Зачем беспокоиться обо всех этих преобразованиях вместо того, чтобы печатать непосредственно из XML-файла?

2. Я новичок, и это был самый логичный способ, который я себе представлял.

3. Я бы посоветовал вам отредактировать свой вопрос с помощью репрезентативного образца xml и ожидаемого результата из этого образца, и мы сможем посмотреть, что с ним можно сделать.

4. Хорошо, я добавил репрезентативный образец xml и ожидаемый результат из этого образца

Ответ №1:

Существует несколько способов приблизиться к этому, но в основном, поскольку вы имеете дело с XML-файлом, вы также можете использовать инструменты xml, такие как xpath.

Допустим, ваш 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
  

Отсюда вы можете форматировать выходные данные, загружать их в dataframe или что-то еще.

Комментарии:

1. Ваш код, похоже, работает нормально, но у меня все еще есть одна последняя ошибка, связанная с файлом XML: lxml.etree.XMLSyntaxError: Start tag expected, '<' not found, line 1, column 1 Это сбивает с толку, потому что я проверил свой файл, и в первой строке <Brevier> , как правило, не должно быть никаких ошибок.

2. @marou95thebest Ваш фактический xml, вероятно, отличается от образца в моем вопросе, поэтому ошибка указывает на некоторую проблему с форматированием xml. Иногда это можно решить, изменив doc = etree.XML(meds) на doc = etree.fromstring(meds) . Если нет, вы должны убедиться, что ваш фактический xml действителен.