Как записать CSV в следующий столбец - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть вывод, который я могу записать в CSV.Однако из-за того, как я настроил свой XML на текст, выходные данные повторяются неправильно.Я много пробовал исправить свой вывод XML, но я не вижу способа это исправить.

Я много пробовал, в том числе изменил свои выражения XML, пытаясь записать в CSV разныено я не могу заставить строки соответствовать так, как мне нужно, из-за операторов for in различной глубины.

Мне все равно, как это делаетсяДо тех пор, пока они совпадают, потому что данные в конечном итоге поступают в мою базу данных SQL.

Ниже мой код,

import os
import sys
import glob
import xml.etree.ElementTree as ET
firstFile = open("myfile.csv", "a")
firstFile.write("V-ID,")
firstFile.write("HostName,")
firstFile.write("Status,")
firstFile.write("Comments,")
firstFile.write("Finding Details,")
firstFile.write("STIG Name,")

basePath = os.path.dirname(os.path.realpath(__file__))
xmlFile = os.path.join(basePath, "C:\\Users\\myUserName\\Desktop\\Scripts\\Python\\XMLtest.xml")
tree = ET.parse(xmlFile)
root = tree.getroot()

for child in root.findall('{http://checklists.nist.gov/xccdf/1.2}title'):
    d = child.text    
for child in root:
    for children in child.findall('{http://checklists.nist.gov/xccdf/1.2}target'):
        b = children.text
for child in root.findall('{http://checklists.nist.gov/xccdf/1.2}Group'):
    x = (str(child.attrib))
    x = (x.split('_')[6])
    a = x[:-2]
    firstFile.write("\n" + a + ',')
for child in root:
    for children in child:
        for childrens in children.findall('{http://checklists.nist.gov/xccdf/1.2}result'):
            x = childrens.text
            if ('pass' in x):
                c = 'Completed'
            else:
                c = 'Ongoing'
            firstFile.write('\t' + '\n' + ',' + b + ',' + c + ',' + ',' + ',' + d)
firstFile.close()

ниже мой токовый выход CSV, enter image description here

ниже нужный мне выход,

enter image description here

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Подумайте, как выглядит выход CSV, а затем подумайте, как он должен выглядеть.

Ваш CSV генерируется следующими двумя циклами:

for child in root.findall('{http://checklists.nist.gov/xccdf/1.2}Group'):
    x = (str(child.attrib))
    x = (x.split('_')[6])
    a = x[:-2]
    firstFile.write("\n" + a + ',')
for child in root:
    for children in child:
        for childrens in children.findall('{http://checklists.nist.gov/xccdf/1.2}result'):
            x = childrens.text
            if ('pass' in x):
                c = 'Completed'
            else:
                c = 'Ongoing'
            firstFile.write('\t' + '\n' + ',' + b + ',' + c + ',' + ',' + ',' + d)

Это означает, что все, что выдобавьте к вашему CSV-файлу во втором цикле будет написано ПОСЛЕ того, что было добавлено в первом цикле.

Я могу придумать две идеи, чтобы решить это из головы:

  1. Каким-то образом объединить циклы в один, создавая таким образом каждую строку за одну итерацию цикла.Однако я не знаю, работает ли это с вашими параметрами.
  2. Не добавляйте в конец CSV-файла, а добавляйте в строку, которую вы хотите добавить, специально указав функцию "write", гдеписать.

Отказ от ответственности: я вообще не знаком с Python, это всего лишь логический источник проблемы и два решения, которые должны работать в теории.Я не знаю, выполнимо ли одно из них.

0 голосов
/ 05 апреля 2019

Это исправило это для меня.Я в основном оставил все как есть, поместил его в CSV, затем прочитал CSV, сохранил столбцы в виде списка, удалил пробелы и экспортировал их обратно.

import os
import sys
import glob
import csv
import xml.etree.ElementTree as ET
firstFile = open("myfile.csv", "a")
path = 'C:\\Users\\JT\\Desktop\\Scripts\\Python\\xccdf\\'
for fileName in glob.glob(os.path.join(path, '*.xml')):
    with open('C:\\Users\\JT\\Desktop\\Scripts\\Python\\myfile1.csv', 'w', newline='') as csvFile1:
        csvWriter = csv.writer(csvFile1, delimiter=',')
        # do your stuff
        tree = ET.parse(fileName)
        root = tree.getroot()
        # Stig Title
        for child in root.findall('{http://checklists.nist.gov/xccdf/1.2}title'):
            d = child.text    
        # hostName
        for child in root:
            for children in child.findall('{http://checklists.nist.gov/xccdf/1.2}target'):
                b = children.text
        # V-ID    
        for child in root.findall('{http://checklists.nist.gov/xccdf/1.2}Group'):
            x = (str(child.attrib))
            x = (x.split('_')[6])
            a = x[:-2]
            firstFile.write(a + '\n')
        # Status
        for child in root:
            for children in child:
                for childrens in children.findall('{http://checklists.nist.gov/xccdf/1.2}result'):
                    x = childrens.text
                    firstFile.write(',' + b + ',' + x + ',' + ',' + ',' + d + '\n')

with open('C:\\Users\\JT\\Desktop\\Scripts\\Python\\myfile.csv', 'r') as csvFile:
    csvReader = csv.reader(csvFile, delimiter=',')
    vIDs = []
    hostNames = []
    status = []
    stigTitles = []
    for line in csvReader:
        vID = line[0]
        vIDs.append(vID)
        try:
            hostName = line[1]
            hostNames.append(hostName)
        except:
            pass
        try:
            state = line[2]
            status.append(state)
        except:
            pass
        try:
            stigTitle = line[5]
            stigTitles.append(stigTitle)
        except:
            pass

    with open('C:\\Users\\JT\\Desktop\\Scripts\\Python\\myfile1.csv', 'a', newline='') as csvFile1:
        csvWriter = csv.writer(csvFile1, delimiter=',')
        vIDMod = list(filter(None, vIDs))
        hostNameMod = list(filter(None, hostNames))
        statusMod = list(filter(None, status))
        stigTitlesMod = list(filter(None, stigTitles))
        csvWriter.writerows(zip(vIDMod, hostNameMod, statusMod, stigTitlesMod))
        firstFile.close()
0 голосов
/ 01 апреля 2019

попробуйте изменить это
x = (x.split ('_') [0])

...