【问题标题】:python print the first line from a looppython从循环中打印第一行
【发布时间】:2014-12-28 18:05:46
【问题描述】:

我正在尝试打印循环中的第一行。该循环是在解析 Nmap 生成的 XML 文件后生成的。我不想使用 subprocess 并调用 bash 命令来执行此操作,但我不知道该怎么做。这是下面代码中的第二个 for 循环。

from libnmap.parser import NmapParser

rep = NmapParser.parse_fromfile('Linux_int.xml')

for _host in rep.hosts:
    host = ', '.join(_host.hostnames)
    ip = (_host.address)
    print "HostName: ",host,"--", ip
    #print  _host.os_fingerprinted
host_string  = ip


for osmatch in _host.os.osmatches:
    os = osmatch.name
    accuracy = osmatch.accuracy
    print "Operating System Guess: ", os, "Accuracy Detection", accuracy
    #print os.splitlines()[0:1]


for services in _host.services:
    print services.port, services.protocol, services.state, services.service
    server_address = (host_string,services.port)

这是循环生成的输出。

Operating System Guess:  Linux 3.7 - 3.9 Accuracy Detection 98
Operating System Guess:  Linux 3.8 Accuracy Detection 95
Operating System Guess:  AXIS 210A or 211 Network Camera (Linux 2.6) Accuracy Detection 94
Operating System Guess:  Netgear DG834G WAP or Western Digital WD TV media player Accuracy Detection 94
Operating System Guess:  Linux 3.1 Accuracy Detection 93
Operating System Guess:  Linux 3.2 Accuracy Detection 93
Operating System Guess:  Linux 3.7 Accuracy Detection 92
Operating System Guess:  Linux 3.2.0 Accuracy Detection 91
Operating System Guess:  Linux 3.9 Accuracy Detection 91
Operating System Guess:  Linux 2.6.32 - 3.6 Accuracy Detection 91

这是正在解析的 XML 文件。

https://www.dropbox.com/s/7me7mxzawmkqj7m/Linux_int.xml?dl=0

【问题讨论】:

  • 您不应该使用os 作为变量名。它是内置的。
  • 只是break 退出循环。
  • 您在寻找break 关键字吗?
  • 哦。谢谢各位。解决方案非常简单,我现在感觉自己像个空头:)

标签: python linux python-2.7 nmap


【解决方案1】:

如 cmets 中所述,只需将 break 排除在循环之外。如果您对其他行完全不感兴趣。

for osmatch in _host.os.osmatches:
    os_name = osmatch.name
    accuracy = osmatch.accuracy
    print "Operating System Guess: ", os_name, "Accuracy Detection", accuracy
    break

这段代码也可以这样简化:

print "Operating System Guess: ", \
      _host.os.osmatches[0].name, \
      "Accuracy Detection", _\
      host.os.osmatches[0].accuracy

如果_host.os.matches 有可能为空,您可以将其放在 try/catch 块中。

如果您收到IndexError,这是try/catch:

try:
    print "Operating System Guess: ", \
          _host.os.osmatches[0].name, \
          "Accuracy Detection", _\
          host.os.osmatches[0].accuracy
except IndexError:
    print "No os matches found."

【讨论】:

  • 是的。这么简单……不知道为什么我没有想到。谢谢你:)
  • 关于try catch all。这是“例外”还是别的什么?你能给我一个指针供以后参考吗?一个链接就可以了。想学。
  • 在我的示例中,您正在访问列表中的第一项,但如果该列表完全为空,您将获得IndexError。对于 for 循环,这并不是真正需要考虑的因素,因为如果列表恰好为空,for 循环将不会做任何事情。
  • 啊,我明白了。这很有帮助。谢谢你:)
【解决方案2】:
print(_host.os.osmatches[0])

基本上会在不中断循环的情况下做到这一点。您甚至不必使用 for 循环来打印它。如果它是一个列表元组等,它将打印第一个元素。如果它是一个字符串,那么它将打印它的第一个字符。

喜欢:

a="stackover flow"
print (a[0])
>>>
s
>>>

我很惊讶没有人写这个。

【讨论】:

  • 基本上是我写的。一个问题是,您所做的事情与海报试图做的事情并不完全相同。
  • 好吧,他使用 for 循环并尝试打印第一件事,它是在没有任何循环的情况下这样做的。
  • 他在文本中混合,特别是“操作系统猜测:”和“准确度检测”,然后只打印 osmatches 的特定成员,而您正在打印整个内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
相关资源
最近更新 更多