2016-10-17 5 views
0

Учитывая следующий файл xml, в котором хранятся значения информации о поездке транспортных средств. Как я могу создать кумулятивное пройденное расстояние по каждому временному шагу в виде .text-файла. В xml нет определенного порядка, это все случайное.Python: извлечение данных из 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> 

output.textfile

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

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

ответ

0

Я уверен, что есть лучшее решение, которое использует библиотеку 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] 
0

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

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() 
0

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

# 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 
Смежные вопросы