2016-11-10 164 views
2

我在寫一個腳本,它以二進制形式讀取子網並將其轉換爲十進制。該腳本需要輸出以句點分隔的十進制結果(即輸出如下所示:255.255.255.0)。在for循環中分離打印件

我正在嘗試使用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=".") 

我怎樣才能使打印輸出與週期分開?

+1

你能提供一個你想要的輸出的例子嗎? –

+4

您可以使用「,」。join(octets) –

+0

@leaf輸出示例顯示在第一段 - 1111 1111.1111 1111中。1111 1111.0000 0000將被輸出爲255.255.255.0。 RômuloM. Farias你能否解釋一下更多關於.join的工作方式?我可以在沒有for循環的情況下使用它嗎? –

回答

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

首先轉換您的八位字節爲十進制,將它們轉換回爲字符串,然後再加入使用字符串'.'.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' 
>>> 
0

如果你有一個IPv4地址,在「01」 -s給出點/空格分隔的二進制數字特林:

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 
0

你的問題明確要求如何將打印分開。 ...

問題在於,您在單個「對象」上多次調用print,因此無法獲得所需的行爲。在列表/元組值操作時,打印函數分隔符將按照您想要的方式工作。

我的建議是將您的輸入值轉換爲所需字符串的列表,然後按照您的意圖使用print()和sep =,即。不要在你的轉換循環

>>> 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功能。