如何将 CSV 写入下一列
How to write CSV into the next column
我有可以写入 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 当前输出,
下面是我需要的输出,
尝试改变这个
x = (x.split('_')[0])
想想你的 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 文件的末尾,而是通过具体告诉 "write" 函数写入的位置来添加到要添加的行。
免责声明:我根本不熟悉Python,这只是问题的逻辑来源和理论上应该可行的两个解决方案。不知道可不可以。
这对我来说已经解决了。我基本上保持原样,将其放入 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()
我有可以写入 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 当前输出,
下面是我需要的输出,
尝试改变这个
x = (x.split('_')[0])
想想你的 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 文件的末尾,而是通过具体告诉 "write" 函数写入的位置来添加到要添加的行。
免责声明:我根本不熟悉Python,这只是问题的逻辑来源和理论上应该可行的两个解决方案。不知道可不可以。
这对我来说已经解决了。我基本上保持原样,将其放入 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()