Как преобразовать xml файл в вывод CSV в python? - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть файл basi 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>
</data>

Я хочу получить следующий вывод в файле CSV:

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

Я испробовал несколько методов, приведенный ниже, кажется, ближе всего я получил правильный вывод, но даже это не работает правильно:

import xml.etree.ElementTree as ET
import csv

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

with open('Output.csv', 'w') as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        for TaskName in root.findall('Job1Start'):
            starttime = TaskName.find('Time').text
            task = "Job1"
            writer.writerows(zip(task, starttime))
            print("Job1", starttime)

Выход I получить от этого показано ниже. У него неправильное форматирование, и я только смог найти время запуска задания 1:

Output CSV

Кто-нибудь сталкивался с подобной проблемой?

1 Ответ

2 голосов
/ 03 февраля 2020

writerows вместо writerow вызывает проблему с одним символом и csv.writer. writerows ожидает список списков (или, точнее, итерируемых итераций), и строки являются итеративными, поэтому список строк соответствует требованию, но внутренний элемент «список» представляет собой один символ.

* Для 1007 * также требуется newline='' для документации, а для Windows отсутствие этого параметра отображается как дополнительные пустые строки между строками при открытии CSV в Excel.

Вот решение:

import xml.etree.ElementTree as ET
import csv

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

# Use newline='' per csv docs.  This fixes the blanks lines in your output
with open('Output.csv', 'w', newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow('Task Start Finish'.split())
        for job in range(1,4):
            start = root.find(f'Job{job}Start/Time').text
            end = root.find(f'Job{job}End/Time').text
            # Use writerow not writerows...latter expects list of lists.
            writer.writerow([f'Job{job}',start,end])

Выход:

Task,Start,Finish
Job1,20200202055415725,20200202055423951
Job2,20200202055810390,20200202055819000
Job3,20200202055814687,20200202055816708
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...