我是Python的初学者,并通过Pandas使用数据框。我正在尝试使用xml.dom.minidom
从XML文件中提取表格到Excel文件中。这就是原始表的外观(请注意“ Bike”下的黑色条目):
VEHICLE BRAND
Car Mercedes
Bike Kawasaki
Ducati
Truck Ram
我正在尝试从给定的XML文件中提取该表:
<Info_Collection>
<Info car="Car">
<V_Collection>
<Brand type="Mercedes"/>
</V_Collection>
</Info>
<Info car="Bike">
<V_Collection>
<Brand type="Kawasaki"/>
<Brand type="Ducati"/>
</V_Collection>
</Info>
<Info car="Truck">
<V_Collection>
<Brand type="Ram"/>
</V_Collection>
</Info>
</Info_Collection>
这是我正在使用的代码:
def main():
x1=[]
x2=[]
doc = xml.dom.minidom.parse('xml_file')
t1 = doc.getElementsByTagName("Info")
t2 = doc.getElementsByTagName("Brand")
for a in t1:
x1.append(tb.getAttribute("car"))
for a in t2:
x2.append(tb.getAttribute("type"))
while len(x1) != len(x2):
x1.append("")
boDF = pd.DataFrame({'VEHICLE': x1, 'BRAND':x2})
boDF.to_excel(writer, sheet_name='Sheet1', index=0, startrow=1)
writer.save()
if __name__ == "__main__":
main()
运行后,输出表如下:
VEHICLE BRAND
Car Mercedes
Bike Kawasaki
Truck Ducati
Ram
有人可以帮助我找出如何在“自行车”和“卡车”之间插入空格吗?我尝试同时运行两个for循环,并比较它们的长度,以查看它们是否相等,如果不相等,则会在第一列中添加一个空格。但是,我无法使其正常工作。我知道我的代码中的while循环在第一列的末尾添加了一个空格,但是我不知道如何在列内添加任何内容。
请参见下文。
想法是创建一个通常与Excel关联的csv文件。 XML解析是通过内置的python XML解析库'ElementTree'完成的。当您双击csv文件时,通常它将由Excel打开,您将获得所需的表。
注意您发布的XML不是有效的XML,必须予以修复(v_Collection与V_Collection)
import xml.etree.ElementTree as ET
xml = '''<Info_Collection>
<Info car="Car">
<V_Collection>
<Brand type="Mercedes"/>
</V_Collection>
</Info>
<Info car="Bike">
<V_Collection>
<Brand type="Kawasaki"/>
<Brand type="Ducati"/>
</V_Collection>
</Info>
<Info car="Truck">
<V_Collection>
<Brand type="Ram"/>
</V_Collection>
</Info>
</Info_Collection>'''
data = [['VEHICLE', 'BRAND']]
root = ET.fromstring(xml)
info_list = root.findall('.//Info')
cars = set()
for info_entry in info_list:
car = info_entry.attrib['car']
for brand in [brand.attrib['type'] for brand in info_entry.findall('.//Brand')]:
data.append([car if car not in cars else '', brand])
cars.add(car)
with open('cars.csv', 'w') as out:
for entry in data:
out.write(','.join(entry) + '\n')
输出(cars.csv)
VEHICLE,BRAND
Car,Mercedes
Bike,Kawasaki
,Ducati
Truck,Ram