1

我花了几个小时研究,这让我很难过。在我走上新的道路之前,我正在寻找最佳实践。

根据列表中的项目数量,在给定起始 IP 时,我最终想要一个 IP 列表(只是IP)。

我一直在使用该ipaddress模块;这是我得到的最近的..

import ipaddress
IP_Start = 192.168.1.1
hostnames = [hostname1, hostname2, hostname3]
list_of_ips = []
my_range = range(len(hostnames))
for ips in my_range:
    list_of_ips.append(ipaddress.ip_address(IP_Start) + my_range[ips])
print(list_of_ips)

输出:

list_of_ips = [IPv4Address('192.168.1.1'), IPv4Address('192.168.1.2'), IPv4Address('192.168.1.3')]

出于某种原因,我无法从字符串列表中删除“IPv4Address(' ')”;我的输出可能不是传统的列表。使用时str.replace,我会遇到奇怪的错误,并且replac认为这可能不是最佳做法。

我觉得如果我ipaddress放弃模块,会有一种更简单的方法来做到这一点。这样做的更好方法是什么,所以我的输出很简单

list_of_ips = [192.168.1.1, 192.168.1.2, 192.168.1.3]
4

2 回答 2

1

IPv4Address是返回对象的数据类型。那是一个类的名称;该类的显示函数表示它返回您看到的格式,IP 地址为字符串。您需要查找类以找到方法(函数)或属性(数据字段)以将 IP 地址作为字符串提供给您,而无需其他对象标记。

最简单的方法是转换为str

for ips in my_range:
    list_of_ips.append(str(ipaddress.ip_address(IP_Start)) ... )
于 2018-08-06T21:21:44.257 回答
0

这是仅使用内置函数的方法

从一个将 IP 地址转换为长整数的函数开始,以及将长整数转换回 IP 地址的另一个函数

import socket,struct
def ip_to_int(ip_address):
    return struct.unpack('!I', socket.inet_aton(ip_address))[0]


def int_to_ip(int_value):
    return socket.inet_ntoa(struct.pack('!I', int_value))

那么你需要做的就是遍历你的范围

def iter_ip_range(start_address, end_address):
    for i in range(ip_to_int(start_address), ip_to_int(end_address) + 1):
        yield int_to_ip(i)

就用它

print(list(iter_ip_range("192.168.11.12","192.168.11.22")))
于 2018-08-06T21:24:48.080 回答