如何使用python数据帧更新和添加XML文件中的属性
我是XML新手,有没有有效的方法使用熊猫数据框匹配文本并更新XML文件 这是我的大XML文件的一小部分,它仍然遵循适当的格式 XML文件(input.XML):如何使用python数据帧更新和添加XML文件中的属性,python,xml,pandas,elementtree,xml.etree,Python,Xml,Pandas,Elementtree,Xml.etree,我是XML新手,有没有有效的方法使用熊猫数据框匹配文本并更新XML文件 这是我的大XML文件的一小部分,它仍然遵循适当的格式 XML文件(input.XML): #文件继续。。。。 数据帧(用作输入): 我想匹配name列中的元素,如果匹配,则使用列的其余部分创建新属性,如下所示。例如,如果来自df['name']的元素(M_20_K40745170)存在/匹配,则在输出文件中分别使用以下行更新相应的节点 <per fre="Volum_5mb" value=&qu
#文件继续。。。。
数据帧(用作输入):
我想匹配name
列中的元素,如果匹配,则使用列的其余部分创建新属性,如下所示。例如,如果来自df['name']
的元素(M_20_K40745170
)存在/匹配,则在输出文件中分别使用以下行更新相应的节点
<per fre="Volum_5mb" value="89.00"/>
<per fre="Volum_40mb" value="44.00"/>
<per fre="Volum_70mb" value="77.00"/>
我对Python XML编码还不熟悉。我不知道如何使用熊猫数据帧在XML文件中添加新属性。
请帮忙。
感谢和问候。您可以学习
xml
和xpath
,因为主要问题与pandas
无关,而是xml
您可以使用更复杂的xpath
查找名为M_20_K40745170
的节点和子节点mwam
,您必须在其中搜索pre
并更新它(甚至添加新的pre
)
您可以为此使用df.iterrows()
for index, row in df.iterrows():
node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:
item = node.find('./per[@fre="{}"]'.format(fre))
#print(fre, item)
if not item:
item = ET.SubElement(node, 'per')
item.set('fre', fre)
item.set('value', str(row[fre]))
稍后,您可以使用“volume\u 5mb”
并创建新的和/或更新值
if not item: # if item is None:
item = ET.SubElement(node, 'per')
item.set('fre', "Volum_5mb")
item.set('value', str(row['Volum_5mb']))
您可以使用list['volumu\u 5mb'、'volumu\u 40mb'、'volumu\u 70mb']
进行此操作
for index, row in df.iterrows():
node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:
item = node.find('./per[@fre="{}"]'.format(fre))
#print(fre, item)
if not item:
item = ET.SubElement(node, 'per')
item.set('fre', fre)
item.set('value', str(row[fre]))
代码中直接包含示例数据的最小工作代码,但您应该从文件中读取它们
text = ''' name Volum_5mb Volum_40mb Volum_70mb
1 M_20_K40745170 89.00 44.00 77.00
2 M_20_K40745171 77.00 65.00 94.00'''
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<brand by="hhdhdh" date="2014/01/01" name="OOP-112200" Insti="TGA">
<design name="OOP-112200" own="TGA" descri="" sound_db="JJKO">
<sec name="abcd" sound_freq="abcd" c_ty="pv">
<feature number="48">
<tfgt v="0.1466469683747654" y="0.0" units="sec" />
</feature>
<mwan sound_freq="abcd" first_name="g7tty" description="xyz" />
</sec>
<sec name="M_20_K40745170" sound_freq="mhr17:7907527-7907589" tension="SGCGSCGSCGSCGSC" s_c="0">
<feature number="5748">
<tfgt v="0.1466469683747654" y="0.0" units="sec" />
</feature>
<mwan sound_freq="mhr17:7907527-7907589" first_name="g7tty" description="xyz">
</mwan>
</sec>
<sec name="M_20_K40745171" sound_freq="mhr17:7907528-7907599" tension="SGCGSCGSCGSHHGSC" s_c="0">
<feature number="5748">
<tfgt v="0.1466469683747654" y="0.0" units="sec" />
</feature>
<mwan sound_freq="mhr17:7907527-7907589" first_name="gtftty" description="xyz">
<xyz abc="trt" id="abc" />
<per fre="acc" value="abc" />
<per fre="xyz" value="abc" />
<per fre="yy" value="abc" />
</mwan>
</sec>
</design>
</brand>'''
import pandas as pd
import io
import xml.etree.ElementTree as ET
#df = pd.read_csv('input.csv')
df = pd.read_csv(io.StringIO(text), sep='\s+')
#print(df)
#tree = ET.('input.xml')
#root = tree.getroot()
root = ET.fromstring(xml)
tree = ET.ElementTree(root)
for index, row in df.iterrows():
node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:
item = node.find('./per[@fre="{}"]'.format(fre))
#print('item:', fre, '=', item)
if not item:
#print('new', item, fre)
item = ET.SubElement(node, 'per')
#item.tail = '\n ' # to pretty print
item.set('fre', fre)
item.set('value', str(row[fre]))
#print(ET.tostring(node).decode())
#---
print( ET.tostring(root) )
#tree.write('output.xml')
text=''名称卷大小为5mb卷大小为40mb卷大小为70mb
1米20米K40745170 89.00 44.00 77.00
2米20米K40745171 77.00 65.00 94.00英寸
xml=“”
'''
作为pd进口熊猫
输入io
将xml.etree.ElementTree作为ET导入
#df=pd.read\u csv('input.csv')
df=pd.read_csv(io.StringIO(文本),sep='\s+'))
#打印(df)
#tree=ET.('input.xml')
#root=tree.getroot()
root=ET.fromstring(xml)
tree=ET.ElementTree(根)
对于索引,df.iterrows()中的行:
node=root.find('./design/sec[@name=“{}”]//mwan.format(行['name']))
对于[‘容量5mb’、‘容量40mb’、‘容量70mb’]中的fre:
item=node.find('./每[@fre=“{}”]'.格式(fre))
#打印('item:',fre',=',item)
如果不是项目:
#打印('新',项目,频率)
item=ET.SubElement(节点“per”)
#item.tail='\n'#要打印
项目集('fre',fre)
item.set('value',str(行[fre]))
#打印(ET.tostring(node.decode())
#---
打印(ET.tostring(根))
#write('output.xml')
Doc:首先学习如何使用
xlm.etree
以及如何使用,因为您的主要问题与pandas
没有直接关系。那么node.set(“value”,“89.00”)
您可以先找到所有节点,然后将它们与df
一起使用-这样您只需搜索每个节点一次。在当前代码中,您可以多次搜索同一个节点。顺便说一句:node=tree.findall('./design/sec[@name=“M\u 20\u K40745170”]”)
,以后您可以执行node.find('./per[@fre=“volume\u 5mb”]\)
谢谢您的建议!您正在添加和pre
作为新属性,而不是per
,因为您正在使用pre和“volumu_5mb”
搜索/检查,无论如何,您将得到无
顺便说一句,谢谢您的解释
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:
item = node.find('./per[@fre="{}"]'.format(fre))
#print(fre, item)
if not item:
item = ET.SubElement(node, 'per')
item.set('fre', fre)
item.set('value', str(row[fre]))
text = ''' name Volum_5mb Volum_40mb Volum_70mb
1 M_20_K40745170 89.00 44.00 77.00
2 M_20_K40745171 77.00 65.00 94.00'''
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<brand by="hhdhdh" date="2014/01/01" name="OOP-112200" Insti="TGA">
<design name="OOP-112200" own="TGA" descri="" sound_db="JJKO">
<sec name="abcd" sound_freq="abcd" c_ty="pv">
<feature number="48">
<tfgt v="0.1466469683747654" y="0.0" units="sec" />
</feature>
<mwan sound_freq="abcd" first_name="g7tty" description="xyz" />
</sec>
<sec name="M_20_K40745170" sound_freq="mhr17:7907527-7907589" tension="SGCGSCGSCGSCGSC" s_c="0">
<feature number="5748">
<tfgt v="0.1466469683747654" y="0.0" units="sec" />
</feature>
<mwan sound_freq="mhr17:7907527-7907589" first_name="g7tty" description="xyz">
</mwan>
</sec>
<sec name="M_20_K40745171" sound_freq="mhr17:7907528-7907599" tension="SGCGSCGSCGSHHGSC" s_c="0">
<feature number="5748">
<tfgt v="0.1466469683747654" y="0.0" units="sec" />
</feature>
<mwan sound_freq="mhr17:7907527-7907589" first_name="gtftty" description="xyz">
<xyz abc="trt" id="abc" />
<per fre="acc" value="abc" />
<per fre="xyz" value="abc" />
<per fre="yy" value="abc" />
</mwan>
</sec>
</design>
</brand>'''
import pandas as pd
import io
import xml.etree.ElementTree as ET
#df = pd.read_csv('input.csv')
df = pd.read_csv(io.StringIO(text), sep='\s+')
#print(df)
#tree = ET.('input.xml')
#root = tree.getroot()
root = ET.fromstring(xml)
tree = ET.ElementTree(root)
for index, row in df.iterrows():
node = root.find('./design/sec[@name="{}"]//mwan'.format(row['name']))
for fre in ['Volum_5mb', 'Volum_40mb', 'Volum_70mb']:
item = node.find('./per[@fre="{}"]'.format(fre))
#print('item:', fre, '=', item)
if not item:
#print('new', item, fre)
item = ET.SubElement(node, 'per')
#item.tail = '\n ' # to pretty print
item.set('fre', fre)
item.set('value', str(row[fre]))
#print(ET.tostring(node).decode())
#---
print( ET.tostring(root) )
#tree.write('output.xml')