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

можно сохранить усеченное имя в записи.имя, но я хотел сохранить и оригинальное имя.