홈>
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
- 답변 # 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()
관련 자료
- arrays - Java의 csv 파일에 ArrayList 을 작성하는 방법은 무엇입니까?
- python - csv 가져 오기를 수정하려면 어떻게해야합니까?
- python - csv 파일에 완전한 데이터를 쓰는 방법
- scala에서 csv 파일을 맵으로 읽는 방법
- Java로 json 데이터에서 csv 파일을 생성하는 방법은 무엇입니까?
- r - 각 ID에 대해 하나의 레코드를 가질 수 있도록 df를 재구성하는 방법
- python - pip로 모든 종속성을 설치하는 방법은 무엇입니까?
- vector : 파일에서 Vec으로 숫자 목록을 읽는 방법은 무엇입니까?
- java - 배열의 행 합계를 어떻게 얻습니까?
- python - 그리드 선의 시작 위치를 설정하는 방법은 무엇입니까?
- Quicksight에서 마지막 기록 만 얻는 방법은 무엇입니까?
- html - 같은 행에서 사이드 바와 본문 섹션을 수정하는 방법은 무엇입니까?
- mobile - 앱 Android에서 adb 출력을 얻는 방법은 무엇입니까?
- mount - WSL rootfs의 크기를 줄이려면 어떻게합니까?
- 시간을 얻고 파이썬에서 UTC로 변환하는 방법
- java - Csv 파일에서 OffsetDateTime을 구문 분석하는 방법
- bash - 마지막으로 수정 된 4 개의 파일을 추적하는 방법은 무엇입니까?
- python - CSV 파일 크기를 조정하는 방법
- html - PHP 클릭 한 링크의 이름을 얻는 방법?
- 이 합계를 R로 작성하는 방법은 무엇입니까?
관련 질문
- python : pandas to_csv는 비어 있고 지정되지 않은 파일을 만듭니다.
- python : Flask 패키지와 함께 업로드 된 csv 파일을 기반으로 출력하는 방법은 무엇입니까?
- Python : str json을 csv 파일에 작성하는 방법?
- python : UTF-8 인코딩 설정 후 CSV 파일에 기록되지 않은 변경 사항
- Python, 수천 개의 레code가있는 .csv에서 분 초를 십진수로 일괄 변환
- CSV 파일 업로드 및 상호 작용을위한 Python 위젯
- 요소 트리를 사용하여 XML 구문 분석 (Python)
- python : coinmarketcap API에서 정보 구문 분석 시도
- python : Pandas는 줄 바꿈을 제거하고 텍스트 파일을 CSV로 변환
- python : xml-diff-태그로 데이터 가져 오기
이것을 변경해보십시오
x = (x.split ( '_') [0])