Python 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

我是编程新手,目前正在尝试将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_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已经找到了解决问题的方法-请参阅他们问题下的最后一条评论。