如何分割socket的gethostbyaddr返回值并写入文件?

1 投票
2 回答
4424 浏览
提问于 2025-04-17 13:41

我有一个脚本,它从一个文件中读取地址,然后用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

有人知道怎么把这个分开吗?如果需要的话可以提供更多代码。

2 个回答

4

你想要做的事情是把包含你需要的信息的元组拆开。拆开元组的方法有很多种,但我会这样做:

(name, _, ip_address_list) = socket.gethostbyaddr(ip)
ip_address = ip_address_list[0]
destfile.write(ip_address + " resolves to " + name)
4

首先,第一步是把这行代码拆成多行:

host = socket.gethostbyaddr(ip)

现在,你可以对这些行做任何你想做的事情。如果你不知道该怎么做,可以试着打印出 hosttype(host)。你会发现它是一个包含3个元素的 tuple(虽然在这个情况下,你也可以从写入文件的字符串中猜到这一点),而你需要的是第一个元素。所以:

hostname = host[0]

或者:

hostname, _, addrlist = host

现在,你可以把这个写入输出:

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

另一种获取相同信息的方法是查看 文档,文档中说:

返回一个三元组(主机名,别名列表,IP地址列表),其中主机名是响应给定IP地址的主要主机名,别名列表是一个(可能为空的)替代主机名列表,IP地址列表是同一主机上同一接口的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.

撰写回答