赞
踩
又称:怎么通过python读取SUMO里生成的lyy.rou.xml文件信息并对其进行修改和保存。
因为觉得每次仿真的时候,想去重新设置flow里的vehsPerHour数值都要打开路由文件进行修改数值,感觉非常麻烦,跑一次仿真之前要打开多个文件进行修改数据,很麻烦,就想都写在py文件里在一个地方进行修改,就可以节省一点步骤了。
不知道为什么,网上找的用python读取xml文件然后进行修改保存的教程,我跟着做,都失败了,而且感觉SUMO生成的这个路由文件的xml格式和常规的xml格式也有点区别。最后我在官网上按照官网的解释和例子跟着做,去理解,然后将其代替成我的这个路由文件来尝试,终于成功了。尝试了很多办法,终于成功了,记录一下。
<?xml version="1.0" encoding="UTF-8"?>
<routes>
<vType id="Car_straight" length="5" maxSpeed="33.33" />
<vType id="Car_enter" length="5" maxSpeed="33.33" />
<flow id="a11" color="1,1,0" begin="0" end= "7200" vehsPerHour='100' type="Car_straight" departLane="random" departSpeed="max">
<route edges="E0 E1 E2"/>
</flow>
<flow id="a12" color="1,0,0" begin="0" end= "7200" vehsPerHour='500' type="Car_enter" departLane="random" departSpeed="max">
<route edges="E4 E1 E2"/>
</flow>
</routes>
其中,flow列的vehsPerHour值是我想修改的数值。
根据xml格式来分析,从这个lyy.rou.xml内容来看,< routes>为这个xml文件的根(root),下一级的 vType和flow都是 root下的 child。我想修改的是flow中id="a11"这个列里面的vehsPerHour值。
(1)导入用到的库:
import xml.etree.ElementTree as ET
(2)对xml文件进行解析:
tree = ET.parse('D:\Temp\lyy.rou.xml') ##这里的路径为放置路由文件的路径
(3)获取 root:
root = tree.getroot()
print(root.tag)
print(root.attrib)
打印结果如图:
(4)先查找一下原数据:
print('查找原数据')
print(root[2].attrib['vehsPerHour'])
注意这里,我想查找的是flow中id="a11"这个列里面的vehsPerHour值。前面分析到 vType和flow都是 root下的 child,因此id="a11"的flow按顺序排第三,从0开始计数,即为[2],因此是root[2],从前面步骤(3)能看出, attrib输出的是 <>里面的内容,因此这里用到 attrib,要查找vehsPerHour的值,因此总的一个查找vehsPerHour值的代码语句即为root[2].attrib[‘vehsPerHour’]。
打印结果如图:
(5)对vehsPerHour值修改成我想要的数值。
new_num='2000'
root[2].attrib['vehsPerHour']=str(new_num)
print('修改后的数据')
print(root[2].attrib['vehsPerHour'])
打印结果如图:
(6)最后将修改好的文件进行保存:
tree.write('lyy.rou.xml') #如果文件命名为其他名字,即为保存到新建文件里,与源文件同名即为覆盖内容。
点击路径里的lyy.rou.xml文件查看是否对xml文件修改成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。