【问题标题】:CSV Writer writing duplicate rowsCSV Writer 写入重复行
【发布时间】:2019-12-31 06:00:30
【问题描述】:

我是编程新手,目前正在尝试将 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

【问题讨论】:

  • 您可能缺少导入...不确定NmapParser is 是什么。你也在迭代一个字符串。 report 是一个字符串。所以你的代码用英文写着:for each character in this string, do this task 你的意思是把report 放在一个列表中吗?
  • 对不起,重要的是你我只是编辑我原来的问题。 NmapParser 来自 libnmap libnmap.readthedocs.io/en/latest/index.html 我只想将 Nmap 结果保存到 CSV,这就是我现在能够做到的方式,但它会将结果多次写入 CSV。
  • 有 4 个条目用于测试目的。
  • 是的,但是您要多次重复该任务,以 @MattR 点。您正在迭代 report 这是一个字符串,并且对于该字符串的每个字符,您正在执行写入文件的功能。老实说,您似乎不需要遍历 report 并且可以废弃整个 for-loop
  • 我看到的只是for filename in report:,但在循环中没有对文件名的未来引用(相反,您参考下一行的报告)。

标签: python csv


【解决方案1】:

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

for filename in report

如果某个filename(如file_A.blah)在nmap_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 行 [] --&gt; [ftw, fml] --&gt; [ftw, fml, www.aol.com] --&gt; [ftw, fml, www.aol.com, 10, 20]
第 2 行 [] --&gt; [wtf, wow] 相同模式
第 3 行 [] --&gt; [lol, log] 相同模式
第 4 行 [] --&gt; [omg, okc] 相同模式

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

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

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

【讨论】:

  • OP 已经想出了如何解决他们的问题 - 请参阅他们问题下的最后一条评论。
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
相关资源
最近更新 更多