Python CSV写入程序写入重复行
我是编程新手,目前正在尝试将NMAP XML解析为CSV。 当我打开CSV文件时,我看到有比它应该有的更多的行 任何人都能告诉我我对下面的代码做了什么错误Python CSV写入程序写入重复行,python,csv,Python,Csv,我是编程新手,目前正在尝试将NMAP XML解析为CSV。 当我打开CSV文件时,我看到有比它应该有的更多的行 任何人都能告诉我我对下面的代码做了什么错误 from libnmap.parser import NmapParser import os import csv report = 'nmap_results.xml' with open('nmap_results.csv', 'w') as output_file: writer = csv.writer(output_f
from libnmap.parser import NmapParser
import os
import csv
report = 'nmap_results.xml'
with open('nmap_results.csv', 'w') as output_file:
writer = csv.writer(output_file)
for filename in report:
nmap_report = NmapParser.parse_fromfile(report)
for host in nmap_report.hosts:
row = []
for hostname in host.hostnames:
row.append('{}'.format(hostname))
row.append('{}'.format(host.address))
for serv in host.services:
row.append(serv.port)
writer.writerow(row)
以下是CSV之外的内容:
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80443
google.com,172.18.128.1,53,80443
cnn.com,151.101.1.67,53
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80443
google.com,172.18.128.1,53,80443
cnn.com,151.101.1.67,53
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80443
google.com,172.18.128.1,53,80443
如上所述。看起来你的循环太多了<代码>报告是您的xml。每个文件名在nmap\u results.xml
中出现多少次?因为你的第一个循环说
for filename in report
如果某个文件名
比如文件a.blah
在nmap\u results.xml
中多次出现,那么您将对该报告名多次运行NmapParser.parse\u fromfile(report)
我假设nmap\u report
isa嵌套结构,如JSON或其他XML
{hosts: [ {hostnames: [ftw, fml],
address : www.aol.com,
services : [ {port: 10 },
{port: 20 } ] },
{hostnames: [wtf, wow],
address : www.yahoo.com,
services : [ {port: 31 },
{port: 41 } ] },
{hostnames: [lol, log]
address : www.msn.com,
services : [ {port: 52 },
{port: 62 } ] },
{hostnames: [omg, okc],
address : www.url.com,
services : [ {port: 404 }
{port: 88 } ] },
] }
上面是我设想的nmap\u报告的结构
-
nmap\u report.hosts
是一个包含4项的列表。因此,blah.hosts中x的是有效的
-每个项目(称之为主机
)都是带有键的字典主机名
,地址
,服务
我假装你可以用“点”符号调用Python字典。无论如何。这个结构可以工作。因此,根据您的循环,我们有:
for host in nmap_report.hosts:
row = []
for hostname in host.hostnames:
row.append('{}'.format(hostname))
row.append('{}'.format(host.address))
for serv in host.services:
row.append(serv.port)
writer.writerow(row)``` <--- by the way, this is a typo right? remove these '''
nmap_report.hosts中主机的:
行=[]
对于host.hostnames中的主机名:
追加({}.format(主机名))
append({}.format(host.address))
对于host.services中的服务:
行追加(服务端口)
writer.writerow(行)``您可能缺少导入。。。不确定NmapParser是什么
。此外,您正在对字符串进行迭代<代码>报告
是一个字符串。因此,您的代码用英语说:对于此字符串中的每个字符,是否执行此任务
您的意思是将报告
放在列表中?对不起,导入的是您,我刚刚编辑了我的原始问题。NmapParser来自libnmap我只想将Nmap结果保存到CSV,这是我现在能够做到的,但它会将结果多次写入CSV。有4个条目用于测试。对,但您重复了多次任务,直到@MattR点。您正在迭代report
,这是一个字符串,对于该字符串的每个字符,您都在执行向文件写入的功能。看起来你不需要反复查看报告
,老实说,你只需要为循环
放弃整个。我所看到的是报告中的文件名:
,但在循环中没有对文件名的引用(而是指下一行的报告)。OP已经找到了解决问题的方法-请参阅他们问题下的最后一条评论。