在Python中使用 IP 地址
IP(互联网协议)-地址是计算机网络的基本概念,它为网络提供地址分配功能。 Python提供了ipaddress模块,用于根据 IP 地址的类型(IPv4 或 IPv6)验证和分类 IP 地址。该模块还用于执行广泛的操作,如算术、比较等,以操纵 IP 地址。
验证 IP 地址-
为了验证 IP 地址, Python使用ipaddress模块提供的ip_address()函数,如果 IP 值超出 IP 地址类型的范围,则会引发错误。
- IPv4 :它是一个 32 位数字,通常用十进制数字编写,格式为由点分隔的四个 8 位数字,用于标识机器的网络接口。如果范围值超过 0 到 255,则ip_address()函数会抛出错误。
Python3
# Import module
import ipaddress
# Example of valid IPv4 address
print (ipaddress.ip_address(u'175.198.42.211'))
# Invalid IPv4 address raises error
print (ipaddress.ip_address(u'175.198.42.270'))
Python3
# Import module
import ipaddress
# Example of valid IPv6 address
print (ipaddress.ip_address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334'))
# Invalid IPv6 address raises error
print (ipaddress.ip_address(u'2001:0db8:85a3:0ff0:00000:8a2e:0370:7334'))
Python3
# Import module
import ipaddress
# IPv4 address
print(type(ipaddress.ip_address(u'175.198.42.211')))
print(type(ipaddress.ip_address(u'5.0.0.1')))
# IPv6 address
print(type(ipaddress.ip_address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')))
print(type(ipaddress.ip_address(u'0000:f0f0::7b8a:ffff')))
Python3
# Import module
import ipaddress
# Comparison
print(ipaddress.IPv4Address(u'175.199.42.211') >
ipaddress.IPv4Address(u'175.198.42.255'))
print(ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')
== ipaddress.IPv6Address(u'2001:0dff:85a3:2bfe:070d:8a2e:0370:7334'))
print(ipaddress.IPv4Address(u'179.198.42.211') !=
ipaddress.IPv4Address(u'175.198.42.255'))
print(ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334') <
ipaddress.IPv6Address(u'2001:0dff:85a3:2bfe:070d:8a2e:0370:7334'))
Python3
# Import module
import ipaddress
# Arithmetic Operation on IPv4 address
print(ipaddress.IPv4Address(u'129.117.0.0')-6)
print (ipaddress.IPv4Address(u'175.199.42.211')+55)
print (ipaddress.IPv4Address(u'0.0.0.0')-1)
print (ipaddress.IPv4Address(u'255.255.255.255')+1)
# Arithmetic Operation on IPv6 address
print (ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')-330)
print (ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')+1000)
print (ipaddress.IPv6Address(u'0000::0000')-1)
print (ipaddress.IPv6Address(u'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')+1)
输出 :
175.198.42.211
ValueError: ‘175.198.42.270’ does not appear to be an IPv4 or IPv6 address
- IPv6:由八组四位十六进制数字表示,中间用冒号隔开,每组代表16位,两个八位字节也称为十六进制。如果范围值超过 0 到 FFFF, ip_address()函数会抛出错误。
蟒蛇3
# Import module
import ipaddress
# Example of valid IPv6 address
print (ipaddress.ip_address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334'))
# Invalid IPv6 address raises error
print (ipaddress.ip_address(u'2001:0db8:85a3:0ff0:00000:8a2e:0370:7334'))
输出 :
2001:db8:85a3:2bfe:70d:8a2e:370:7334
ValueError: ‘2001:0db8:85a3:0ff0:00000:8a2e:0370:7334’ does not appear to be an IPv4 or IPv6 address
IP地址操作-
借助ipaddress模块,可以对 IP 地址进行算术、比较、类型等各种操作。下面列出了一些操作:
- Type Check操作: type()方法以各种格式的IP地址为输入,识别是IPv4还是IPv6地址,指示IP地址的类别。
蟒蛇3
# Import module
import ipaddress
# IPv4 address
print(type(ipaddress.ip_address(u'175.198.42.211')))
print(type(ipaddress.ip_address(u'5.0.0.1')))
# IPv6 address
print(type(ipaddress.ip_address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')))
print(type(ipaddress.ip_address(u'0000:f0f0::7b8a:ffff')))
输出 :
- IP 比较操作:基本逻辑运算符可用于比较 IP 地址,无论一个值是否等于或大于或小于另一个值。
蟒蛇3
# Import module
import ipaddress
# Comparison
print(ipaddress.IPv4Address(u'175.199.42.211') >
ipaddress.IPv4Address(u'175.198.42.255'))
print(ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')
== ipaddress.IPv6Address(u'2001:0dff:85a3:2bfe:070d:8a2e:0370:7334'))
print(ipaddress.IPv4Address(u'179.198.42.211') !=
ipaddress.IPv4Address(u'175.198.42.255'))
print(ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334') <
ipaddress.IPv6Address(u'2001:0dff:85a3:2bfe:070d:8a2e:0370:7334'))
输出 :
True
False
True
True
- 算术运算:可以通过执行一些算术运算来操纵 IP 地址。可以从 IP 地址中添加或减去整数。在加法下,如果最后一个八位字节的值超过 255,则前一个八位字节递增,依此类推,如果最后一个八位字节的值小于零,则减法的情况相同,则前一个八位字节递减,依此类推。
蟒蛇3
# Import module
import ipaddress
# Arithmetic Operation on IPv4 address
print(ipaddress.IPv4Address(u'129.117.0.0')-6)
print (ipaddress.IPv4Address(u'175.199.42.211')+55)
print (ipaddress.IPv4Address(u'0.0.0.0')-1)
print (ipaddress.IPv4Address(u'255.255.255.255')+1)
# Arithmetic Operation on IPv6 address
print (ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')-330)
print (ipaddress.IPv6Address(u'2001:0db8:85a3:2bfe:070d:8a2e:0370:7334')+1000)
print (ipaddress.IPv6Address(u'0000::0000')-1)
print (ipaddress.IPv6Address(u'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')+1)
输出 :
129.116.255.250
175.199.43.10
AddressValueError: -1 (< 0) is not permitted as an IPv4 address
AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
2001:db8:85a3:2bfe:70d:8a2e:370:71ea
2001:db8:85a3:2bfe:70d:8a2e:370:771c
AddressValueError: -1 (< 0) is not permitted as an IPv6 address
AddressValueError: 340282366920938463463374607431768211456 (>= 2**128) is not permitted as an IPv6 address