#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 действителен.