我正在编写一个以二进制形式读取子网并将其转换为十进制的脚本。脚本需要输出用句点分隔的十进制结果(即输出看起来像这样:255.255.255.0
)。
我正在尝试使用sep ="."
将打印与句点分开,但是,这似乎不起作用。我怀疑这可能是因为它每次打印单个输出而不是一个完整的语句连接在一起。我尝试end= "."
,但这不是一个选项,因为它会在输出结尾添加一个额外的句点。
以下是该剧本的片段:
sub1 = "1111 1111.1111 1111.1111 1111.0000 0000"
octets = [sub1[0:9], sub1[10:19], sub1[20:29], sub1[30:39]]
for conversion in octets:
print(int((conversion).replace(" ",""), 2), sep=".")
如何使打印输出与句点分开?
答案 0 :(得分:2)
替换所有空格一次,拆分 '.'
上的字符串以创建列表,然后在转换八位字节后使用.join
重建字符串:
sub1 = "1111 1111.1111 1111.1111 1111.0000 0000"
octets = sub1.replace(' ', '').split('.')
print('.'.join(map(str, [int(i, 2) for i in octets])))
# 255.255.255.0
答案 1 :(得分:1)
首先将八位字节转换为十进制,将它们转换回字符串,然后使用'.'.join()
加入字符串
>>> sub1 = "1111 1111.1111 1111.1111 1111.0000 0000"
>>> octets = [sub1[0:9], sub1[10:19], sub1[20:29], sub1[30:39]]
>>> '.'.join([str(int((el).replace(" ",""), 2)) for el in octets])
'255.255.255.0'
>>>
答案 2 :(得分:0)
如果您在“01”-string中以点/空格分隔的二进制数字给出IPv4地址:
binascii_ip = "1111 1111.1111 1111.1111 1111.0000 0000"
然后你可以轻松地将ip作为Python中的对象:
>>> import ipaddress
>>> ipaddress.IPv4Address(int(binascii_ip.replace('.','').replace(' ',''), 2))
IPv4Address('255.255.255.0')
要仅获取255.255.255.0
,只需打印即可。此代码将断言输入有效。
如果您不需要验证输入或对其进行任何操作而不是打印它,那么简单的字符串操作就足够了:
>>> print(*[int(octet, 2) for octet in binascii_ip.replace(' ', '').split('.')],
... sep='.')
255.255.255.0
答案 3 :(得分:0)
您的问题明确询问如何分隔打印件....
问题是您在一个“对象”上多次调用print,因此无法获得所需的行为。当对列表/元组值进行操作时,打印功能分隔符将按您的需要工作。
我的建议是将您的输入值转换为所需字符串的列表,然后按预期使用print()和sep =,即。不要在转换循环中使用print
>>> from __future__ import print_function # ensuring print function used
>>> # Your conversion code here !
>>> sub4 = "123", "234", "345", "456" # intermediate result from conversion loop
>>> print sub4 # show what we have got
('123', '234', '345', '456')
>>> print(*sub4, sep='.') # apply separators between objects printed
123.234.345.456
>>>
正如其他贡献者所表明的那样,有一些替代方法可以进行转换,这些方法对Python来说更“惯用”。 我的观察是尽可能接近你需要的值 - 在字符串或元组等 - 但没有任何文本格式。 然后应用格式作为最后一步 - 在这种情况下使用打印功能的sep功能。