1

我有一个脚本,它从文件中读取地址并使用 socket.gethostbyaddr 查找其主机名,但是这个函数的返回是混乱的,看起来不正确。

它写入目标文件的行读取:

destfile.write(str(socket.gethostbyaddr(ip)))

当它读取 8.8.8.8 时,结果是这样的:

('google-public-dns-a.google.com', [], ['8.8.8.8])

但是,我只需要第一个输出 google-public-dns-a.google.com。我希望让它写入文件并如下所示:

8.8.8.8 resolves to google-public-dns-a.google.com

有谁知道这个怎么拆分?如果需要,可以提供更多代码。

4

2 回答 2

4

您要做的是解压缩包含您想要的信息的元组。有多种方法可以做到这一点,但这是我会做的:

(name, _, ip_address_list) = socket.gethostbyaddr(ip)
ip_address = ip_address_list[0]
destfile.write(ip_address + " resolves to " + name)
于 2013-01-25T20:31:55.910 回答
4

好吧,第一步是将单行拆分为多行:

host = socket.gethostbyaddr(ip)

现在,您可以为所欲为。如果您不知道自己想做什么,请尝试打印hosttype(host). 您会发现它tuple包含 3 个元素(尽管在这种情况下,您可能已经从写入文件的字符串中猜到了),并且您想要第一个。所以:

hostname = host[0]

或者:

hostname, _, addrlist = host

现在,您可以将其写入输出:

destfile.write('{} resolves to {}'.format(ip, hostname))

发现相同信息的另一种方法是查看文档,其中说:

返回一个三元组 (hostname, aliaslist, ipaddrlist),其中 hostname 是响应给定 ip_address 的主要主机名,aliaslist 是相同地址的备用主机名列表(可能为空),ipaddrlist 是 IPv4/v6 地址列表对于同一主机上的同一接口(很可能只包含一个地址)。

或者使用解释器中的内置帮助:

>>> help(socket.gethostbyaddr)
gethostbyaddr(host) -> (name, aliaslist, addresslist)

Return the true host name, a list of aliases, and a list of IP addresses,
for a host.  The host argument is a string giving a host name or IP number.
于 2013-01-25T20:32:24.410 回答