Python: извлечение данных из XML-файла

#python #xml #python-2.7

#python #xml #python-2.7

Вопрос:

Дан следующий файл xml , в котором хранятся значения информации о поездке транспортных средств. Как я могу сгенерировать совокупное пройденное расстояние за каждый временной шаг в виде текстового файла. В xml нет определенного порядка, все случайно.

 <tripinfos>
        <tripinfo id="1" depart="1.00" arrival="2" duration="1.00" distance="3"/>
        <tripinfo id="5" depart="2.00" arrival="4" duration="2.00" distance="5"/>
        <tripinfo id="10" depart="5.00" arrival="8" duration="3.00" distance="1"/>
        <tripinfo id="3" depart="3.00" arrival="6" duration="3.00" distance="2"/>
        <tripinfo id="8" depart="8.00" arrival="10" duration="2.00" distance="4"/>
</tripinfos>
 

вывод.текстовый файл

 0 //Time step #0
0
3
3
8
8
10
10
11
11
15
 

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

1. Вам действительно нужно привести пример того, что вы пробовали, прежде чем кто-либо сможет вам в этом помочь.

Ответ №1:

Я уверен, что есть лучшее решение, использующее библиотеку xml, но вот простое

 import numpy as np

a = open('file.xml')
lines = a.readlines()

my_arr = np.zeros((len(lines)-2,2))
for i in range(len(lines[1:-1])):
    contents=lines[i 1].split('"')
    my_arr[i,0]=(eval(contents[5]))
    my_arr[i,1]=(eval(contents[9]))

#Now sort according to arrival times
my_arr = (my_arr[my_arr[:,0].argsort()])
print(my_arr)

final_output=[]
cum_dist=0
last_index=0

for i in range(int(my_arr[-1,0]) 1):
    if(i == my_arr[last_index,0]):
        cum_dist =my_arr[last_index,1]
        last_index =1
    final_output.append(int(cum_dist))

print(final_output)
np.savetxt('outputfile.txt',np.array(final_output), newline=',',fmt='%s')
a.close()
 

Ваш вывод

 [[  2.   3.]
 [  4.   5.]
 [  6.   2.]
 [  8.   1.]
 [ 10.   4.]]
[0, 0, 3, 3, 8, 8, 10, 10, 11, 11, 15]
 

Ответ №2:

В итоге я использовал dict для хранения каждого времени прибытия, и поскольку я знаю максимальное время прибытия, я могу инициализировать ключ с помощью диапазона.

 import xml.etree.ElementTree as ET

filepath = r'tripinfo.xml'
tree = ET.parse(filepath)
root = tree.getroot()
mydict = {k:[] for k in range(7202)}

for trip in root.iter('tripinfo'):
    arrived = int(float(trip.get('arrival')))
    distance = float(trip.get('distance'))
    mydict[arrived].append(distance)

mysum = 0

outputfilepath = 'travelledDuration.txt'
outputfile = open(outputfilepath, 'a')
for i in range(7202):
    distanceList = mydict[i]
    mysum  = sum(distanceList)
    outputfile.write(str(mysum) "n")
outputfile.close()
 

Ответ №3:

Здесь я предлагаю частичное решение вашей проблемы.

 # import some packages
from numpy import array
import xml.etree.ElementTree as et

# init some lists
ids=[]
depart=[]
arrival=[]
duration=[]
distance=[]

# prep the xml document
xmltxt = """
    <root>
        <tripinfo id="1" depart="1.00" arrival="2" duration="1.00" distance="3"/>
        <tripinfo id="5" depart="2.00" arrival="4" duration="2.00" distance="5"/>
        <tripinfo id="3" depart="3.00" arrival="6" duration="3.00" distance="2"/>
        <tripinfo id="10" depart="5.00" arrival="8" duration="3.00" distance="1"/>
        <tripinfo id="8" depart="8.00" arrival="10" duration="2.00" distance="4"/>
    </root>
"""

# parse the xml text
xmldoc = et.fromstring(xmltxt)

# extract and output tripinfo attributes
# collect them into lists
for item in xmldoc.iterfind('tripinfo'):
    att=item.attrib
    ids.append(int(att['id']))
    depart.append(float(att['depart']))
    arrival.append(float(att['arrival']))
    duration.append(float(att['duration']))
    distance.append(float(att['distance']))

# put lists into an np.array
# and transpose it    
arr=array([ids, depart, arrival, duration, distance]).T

# sort array by 'depart' column. (index=1)
arr = arr[arr[:,1].argsort()]

sumdist=0
dept=0
print "depart: %s; Sum_dist= %s" % ( dept, sumdist )
for ea in arr:
    sumdist  = ea[4] # distance
    dept = ea[1]  # depart
    # get 'arrival', 'duration' here, so that
    # you can use them to manipulate and get your exact solution
    print "depart: %s; Sum_dist= %s" % ( dept, sumdist )
 

Вывод

 depart: 0; Sum_dist= 0
depart: 1.0; Sum_dist= 3.0
depart: 2.0; Sum_dist= 8.0
depart: 3.0; Sum_dist= 10.0
depart: 5.0; Sum_dist= 11.0
depart: 8.0; Sum_dist= 15.0