だから私は以前にこれをやったことがあり、そのような一見単純なタスクのための驚くほど醜いコードです。
目標は、印刷できない文字を. (ドット)。私の目的では、「印刷可能」は最後の数文字string.printable
(改行、タブなど) を除外します。これは、古い MS-DOS デバッグの「16 進ダンプ」形式などを出力するためのものです ... またはそれに類似したもの (空白を追加すると、意図したダンプ レイアウトが台無しになります)。
使用できることはわかっていstring.translate()
ますが、それを使用するには、変換テーブルが必要です。だから私はそれに使いますstring.maketrans()
。これが私が思いつくことができる最高のものです:
filter = string.maketrans(
string.translate(string.maketrans('',''),
string.maketrans('',''),string.printable[:-5]),
'.'*len(string.translate(string.maketrans('',''),
string.maketrans('',''),string.printable[:-5])))
...これは読めない混乱です(ただし、機能します)。
そこから、次のような use を呼び出すことができます。
for each_line in sometext:
print string.translate(each_line, filter)
... そして、幸せになります。(ボンネットの下を見ない限り)。
この恐ろしい表現を別のステートメントに分割すると、より読みやすくなります。
ascii = string.maketrans('','') # The whole ASCII character set
nonprintable = string.translate(ascii, ascii, string.printable[:-5]) # Optional delchars argument
filter = string.maketrans(nonprintable, '.' * len(nonprintable))
そして、読みやすさのためだけにそれを行うのは魅力的です.
しかし、私はこれをもっとエレガントに表現する方法がなければならないと考え続けています!