Python string formatting-ограничить длину строки, но обрезать начало строки
Я использую стандартный модуль ведения журнала Python с пользовательским форматированием, где я ограничиваю длину некоторых полей. Он использует стандарт %
оператор в Python.
Я могу применить ограничение для строки в процентах (это ограничивает длину до 10 символов):
>>> "%.10s" % "Lorem Ipsum"
'Lorem Ipsu'
можно ли обрезать его с самого начала, поэтому вывод 'orem Ipsum'
(без манипулирования аргументом правой стороны)?
3 ответов
можно ли обрезать его с самого начала с % форматирования?
% форматирование Python происходит от printf.
отметим, что .
указывает на точность для float. То, что он работает на строке, является простым побочным эффектом, и, к сожалению,в спецификации форматирования строк нет положения для размещения зачистки строки слева к фиксированной максимальной ширине.
поэтому, если вы должны зачищать строку с фиксированной шириной от конца, я рекомендую срезать с отрицательного индекса. Эта операция является надежной, и не будет ошибкой, если строка меньше 10 символов.
>>> up_to_last_10_slice = slice(-10, None)
>>> 'Lorem Ipsum'[up_to_last_10_slice]
'orem Ipsum'
>>> 'Ipsum'[up_to_last_10_slice]
'Ipsum'
str.format
также не поможет
str.format
не помогает здесь, ширина минимальная ширина:
>>> '{lorem:>10}'.format(lorem='Lorem Ipsum')
'Lorem Ipsum'
>>> '{lorem:*>10}'.format(lorem='Lorem')
'*****Lorem'
("звездочка", "*
", является символом заполнения.)
Это можно легко сделать с помощью нарезки, поэтому вам не требуется никаких манипуляций со строковым форматом для выполнения вашей работы
>>> "Lorem Ipsum"[-10:]
'orem Ipsum'
у меня был тот же вопрос и придумал это решение, используя LogRecordFactory.
orig_factory = logging.getLogRecordFactory()
def record_factory(*args, **kwargs):
record = orig_factory(*args, **kwargs)
record.sname = record.name[-10:] if len(
record.name) > 10 else record.name
return record
logging.setLogRecordFactory(record_factory)
здесь я усекаю имя до 10 символов и сохраняю его в атрибуте sname, который можно использовать как любое другое значение.
%(sname)10s
можно сохранить усеченное имя в записи.имя, но я хотел сохранить и оригинальное имя.