2016-11-10 23 views
2

バイナリ形式のサブネットを読み取り、10進数に変換するスクリプトを作成しています。スクリプトはピリオドで区切られた小数の結果を出力する必要があります(つまり、出力は255.255.255.0のようになります)。forループ内での印刷の分離

sep ="."を使用して印刷をピリオドで区切りますが、これは機能していないようです。私は、それが一緒に結合される1つの完全なステートメントではなく、毎回個々の出力を印刷しているため、これが原因である可能性があります。私は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

最初に戻ってそれらを変換し、あなたのオクテット10進数に変換しますあなたは「01」-sでドット/スペースで区切られたバイナリの数字として与えられたIPv4アドレスを持っている場合は、文字列、およびに'.'.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

を使用して文字列に参加トリング:

binascii_ip = "1111 1111.1111 1111.1111 1111.0000 0000" 

を、あなたが簡単にPythonでオブジェクトとしてIPを得ることができます:

>>> 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

あなたの質問は、明示的にプリントを分離する方法を要求します。 ...

問題は、1つの 'オブジェクト'に複数回プリントを呼び出しているため、必要な動作が得られないということです。プリント機能セパレータは、値のリスト/タプルで操作しているときに、必要に応じて機能します。

私の提案は、あなたの入力値を必要な文字列のリストに変換し、print()とsep =を意図通りに使用することです。他の貢献者が示したように、Pythonのより「慣用的」であり、変換を行うための代替方法があるコンバージョンループに

>>> 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 
>>> 

を印刷を使用しないでください。 私の所見は、文字列やタプルなどで、必要なものにできるだけ近い値を得ることですが、テキスト形式は使用しません。 最後のステップとしてフォーマットを適用します。この場合は、印刷機能のsep機能を使用します。

関連する問題