Python 如何使用多个for in语句写入csv
我有一个Python 3.7.3脚本,它读取XML,解析我需要的内容,并将结果导出到CSV。我必须对其中一个字段使用for in循环来深入XML树,这会使另一个for in语句如何附加到csv 运行以下命令时,我的输出文件不会列出不同的V-ID(请参阅root…语句中的第三个for child),但是所有其他字段都是正确的。当我删除最后一个for in语句并将firstFile.write statement 2选项卡移到左侧时,V-ID显示正确,但是我没有该状态,因此我知道问题出在最后一个语句中。顺便说一句,如果我将firstFile.write语句一直向左移动,它只返回csv中的一行,但应该有5行 有没有办法从输出中创建一个列表,然后将它们全部合并,或者将firstFile.write语句的两个选项卡移到左侧,并将最后一个for-in语句附加到特定列中(基本上分解firstFile.write语句)?或者你还有其他建议吗?Python 如何使用多个for in语句写入csv,python,Python,我有一个Python 3.7.3脚本,它读取XML,解析我需要的内容,并将结果导出到CSV。我必须对其中一个字段使用for in循环来深入XML树,这会使另一个for in语句如何附加到csv 运行以下命令时,我的输出文件不会列出不同的V-ID(请参阅root…语句中的第三个for child),但是所有其他字段都是正确的。当我删除最后一个for in语句并将firstFile.write statement 2选项卡移到左侧时,V-ID显示正确,但是我没有该状态,因此我知道问题出在最后一个语句
最后,花了大约一周的时间来解决这个问题。我将输出转换为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()
你能附上你的XMLtest.xml文件吗?如果你能发布预期的CSV文件来更好地理解你的问题,那就太好了。这有点糟糕了,但我不能发布xml,它是我雇主的专有信息。不过,我会用CSV格式更新我的主要帖子。如果你发布源XML肯定会很有用,我们需要了解结构,这样你就可以删除除一两条记录之外的所有记录,并用占位符替换数据。现在我可以说你以错误的方式迭代记录。遍历第一个字段(标题),然后遍历第二个字段(目标),并从每个列中只保存最后一个值。您需要做的是遍历记录(而不是单独的字段),然后从每个记录中获取数据并写入文件。
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()