CSV Writer编写重复的行

时间:2019-12-30 21:15:18

标签: 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_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,80,443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80,443
google.com,172.18.128.1,53,80,443
cnn.com,151.101.1.67,53
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80,443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80,443
google.com,172.18.128.1,53,80,443
cnn.com,151.101.1.67,53
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80,443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80,443
google.com,172.18.128.1,53,80,443

1 个答案:

答案 0 :(得分:0)

如上所述。看起来您循环太多了。 report是您的xml。每个文件名出现在nmap_results.xml中多少次?因为您的第一个循环说

for filename in report

如果某个filename之类的file_A.blahnmap_results.xml中出现多于一次,那么您将对该报告名称多次运行NmapParser.parse_fromfile(report)

我假设nmap_report是一个嵌套结构,例如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_report结构
-nmap_report.hosts是一个包含4个项目的列表。因此for x in blah.hosts有效的
-每个项目(称为host)都是带有键hostnamesaddressservices

的字典

我冒充您可以使用“点”符号来调用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 '''

第1行[] --> [ftw, fml] --> [ftw, fml, www.aol.com] --> [ftw, fml, www.aol.com, 10, 20]
第2行[] --> [wtf, wow]相同的模式
第3行[] --> [lol, log]相同的模式
第4行[] --> [omg, okc]相同的模式

您应该检查writer.writerow(row)是否也添加了新行,再次检查是否已从该行中删除了这三个后退标记(`)。

根据我从您的结构推断出的示例,您重复的原因是for filename in report:多次使用相同的文件名。

您来自report = 'nmap_results.xml'的文件名不是唯一的。