>

CSV에 쓸 수있는 출력이 있습니다. 그러나 XML을 텍스트로 설정하는 방법으로 인해 출력 자체가 잘못 반복됩니다. XML 출력을 수정하기 위해 많은 노력을 기울 였지만이를 해결할 방법이 없습니다.

XML 문을 수정하여 다른 방식으로 CSV에 쓰려고 시도하는 등 많은 노력을 기울 였지만 행이 필요한 방식으로 일치하도록 할 수는 없습니다. 깊이가 다른 문장에서 사용할 수 있습니다.

데이터가 궁극적으로 내 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 전류 출력입니다.

아래에 필요한 결과가 있습니다,


  • 답변 # 1

    이것을 변경해보십시오
       x = (x.split ( '_') [0])

  • 답변 # 2

    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 파일에 추가 한 것은 첫 번째 루프에서 추가 된 후에 쓰여집니다.

    머리 꼭대기에서 이것을 해결하기위한 두 가지 아이디어를 생각할 수 있습니다 :

    <올>

    어떻게 루프를 하나로 통합하여 하나의 루프 반복으로 각 행을 생성합니다. 그래도 매개 변수와 작동하는지 모르겠습니다.

    CSV 파일의 끝에 추가하지 말고 구체적으로 "쓰기"기능에 쓸 위치를 알려서 추가하려는 행에 추가하십시오.

    면책 조항 : 나는 파이썬에 전혀 익숙하지 않습니다. 이것은 문제의 논리적 근원이며 이론적으로 작동 해야하는 두 가지 솔루션입니다. 둘 중 어느 쪽이 실행 가능한지 모르겠습니다.

  • 답변 # 3

    이 문제가 해결되었습니다. 나는 기본적으로 그대로두고 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()
    
    

  • 이전 javascript - 여러 테이블에서 총 합계를 얻는 방법
  • 다음 가라테 기능 파일에서 Cassandra를 통합하여 테스트 데이터를 삭제하는 방법