Как вывести несколько элементов из XML с одинаковым именем, используя Python? - PullRequest
0 голосов
/ 06 февраля 2020

Этот вопрос является продолжением моего предыдущего поста: Как преобразовать xml файл в формат csv в python?

Опять же, у меня есть основа c XML файл, который извлекается из базы данных вне моего контроля.

<?xml version="1.0" encoding="utf-8"?>
<data>
<Job1Start><Time>20200202055415725</Time></Job1Start>
<Job1End><Time>20200202055423951</Time></Job1End>
<Job2Start><Time>20200202055810390</Time></Job2Start>
<Job3Start><Time>20200202055814687</Time></Job3Start>
<Job2End><Time>20200202055819000</Time></Job2End>
<Job3End><Time>20200202055816708</Time></Job3End>
<Job1Start><Time>20200203053415725</Time></Job1Start>
<Job1End><Time>20200203056423951</Time></Job1End>
</data>

Мой текущий код показан ниже:

import xml.etree.ElementTree as ET
import csv

tree = ET.parse('StackedExample.xml')
root = tree.getroot()

with open('Output.csv', 'w', newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow('Task Start Finish'.split())
        tasklist = ['Job1', 'Job2','Job3']
        for Task in tasklist:
            start = root.find(f'.//{Task}Start/Time').text
            end = root.find(f'.//{Task}End/Time').text
            writer.writerow([f'{Task}',start,end])
            print(f'{Task}',start,end)

Это выводит ниже, но дает только один вывод для "Job1":

Task    Start               Finish
Job1    20200202055415725   20200202055423951
Job2    20200202055810390   20200202055819000
Job3    20200202055814687   20200202055816708

Я ищу что-то вроде этого:

Task    Start               Finish
Job1    20200202055415725   20200202055423951
Job1    20200203053415725   20200203056423951
Job2    20200202055810390   20200202055819000
Job3    20200202055814687   20200202055816708

Есть идеи?

1 Ответ

1 голос
/ 06 февраля 2020

find даст вам только первое появление тега, который вы можете использовать findall для времени начала и findall для времени окончания, затем сделайте zip () из них обоих

import itertools
for Task in tasklist:
    start = root.findall(f'.//{Task}Start/Time')
    start_txt = []
    for s in start:
        start_txt.append(s.text) 
    end = root.findall(f'.//{Task}End/Time')
    end_txt = []
    for e in end_txt:
        end_txt.append(e.text)
    row_list = list(zip(start_txt,end_txt))
    for row in row_list
        writer.writerow([f'{Task}',row[0],row[1]])

не очень элегантно, но работает

import xml.etree.ElementTree as ET
import glob
import os
import pandas as pd

path = r"D:\t.xml"
file = open(path)
tree = ET.parse(file)
root = tree.getroot()
m1 = {"Task": "Job1"}
m2 = {"Task": "Job2"}
m3 = {"Task": "Job3"}
out = []
for t in root:
    time = t.find(".//Time")
    txt = time.text
    if "1Start" in t.tag:
        m1["Start"] = txt
    if "1End" in t.tag:
        m1["End"] = txt
        out.append(m1)
    if "2Start" in t.tag:
        m2["Start"] = txt
    if "2End" in t.tag:
        m2["End"] = txt
        out.append(m2)
    if "3Start" in t.tag:
        m3["Start"] = txt
    if "3End" in t.tag:
        m3["End"] = txt
        out.append(m3)
df = pd.DataFrame(out)
df.to_excel("D:\out.xlsx")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...