Итак, я делал это раньше, и это удивительный уродливый кусок кода для такой, казалось бы, простой задачи.
Цель состоит в том, чтобы перевести любого непечатаемого символа в . (точка). В моих целях «печатный» исключает последние несколько символов из string.printable
(новые строки, вкладки и т. Д.). Это предназначено для печати таких вещей, как старый формат "шестнадцатеричного дампа" отладки MS-DOS ... или чего-то подобного этому (где дополнительные пробелы могут изменить предполагаемый макет дампа).
Я знаю, что могу использовать 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])))
... это нечитаемый беспорядок (хотя и работает).
Оттуда вы можете позвонить, используя что-то вроде:
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))
И заманчиво сделать это только для разборчивости.
Однако я продолжаю думать, что должен быть более элегантный способ выразить это!