Python string formatting - limit string length, but trim string beginning

33,927

Solution 1

Is it possible to trim it from the beginning with % formatting?

Python's % formatting comes from C's printf.

Note that the . indicates precision for a float. That it works on a string is a mere side effect, and unfortunately, there is no provision in the string formatting specification to accommodate stripping a string from the left to a fixed max width.

Therefore if you must strip a string to a fixed width from the end, I recommend to slice from a negative index. This operation is robust, and won't fail if the string is less than 10 chars.

>>> 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 also no help

str.format is of no help here, the width is a minimum width:

>>> '{lorem:>10}'.format(lorem='Lorem Ipsum')
'Lorem Ipsum'
>>> '{lorem:*>10}'.format(lorem='Lorem')
'*****Lorem'

(The asterisk, "*", is the fill character.)

Solution 2

This can easily be done through slicing, so you do not require any string format manipulation to do your JOB

>>> "Lorem Ipsum"[-10:]
'orem Ipsum'

Solution 3

I had the same question and came up with this solution using 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)

Here I am truncating the name to 10 characters and storing it in the attribute sname, which can be used as any other value.

%(sname)10s

It is possible to store the truncated name in record.name, but I wanted to keep the original name around too.

Share:
33,927
Łukasz Rogalski
Author by

Łukasz Rogalski

See my GitHub: https://github.com/rogalski See my LinkedIn: https://www.linkedin.com/in/lukasz-rogalski

Updated on July 06, 2020

Comments

  • Łukasz Rogalski
    Łukasz Rogalski almost 4 years

    I'm using Python standard logging module with custom formatter where I limit length of some fields. It uses standard % Python operator.

    I can apply limit for percent-formatted string like this (this limits length to 10 chars):

    >>> "%.10s" % "Lorem Ipsum"
    'Lorem Ipsu'
    

    Is it possible to trim it from the beginning, so the output is 'orem Ipsum' (without manipulating right-side argument)?

  • Abhijit
    Abhijit over 9 years
    Its good to downvote if the answer is not helpful, but can any one educate me why is it so?
  • Jonathan Eunice
    Jonathan Eunice over 9 years
    Bingo. The "precision" truncation of string formatting (% and .format() inherently removes from the right hand side. So unless you use string truncation, reversing, or another alternative before submitting to formatting, seems impossible.
  • Russia Must Remove Putin
    Russia Must Remove Putin over 9 years
    @JonathanEunice It's a pity that the documentation is so hard to find and unreadable. But .format documentation is fairly well documented and readable. It would have been easier to point to that documentation...
  • Jonathan Eunice
    Jonathan Eunice over 9 years
    The .format documentation is here if you like it. I personally find it rather dense and frustrating. OTOH, it's a reference more than a how-to-use, and the underlying functionality and options are many and detailed.
  • Russia Must Remove Putin
    Russia Must Remove Putin over 9 years
    @JonathanEunice No, I know where that documentation is. It's actually much easier to understand compared to printf docs. But to really understand it you need to spend some time with it. Same with the rest of the language spec: docs.python.org/reference/expressions.html
  • Chinmay Kanchi
    Chinmay Kanchi over 9 years
    Yes, but that requirement can't be satisfied.
  • Alek Kowalczyk
    Alek Kowalczyk about 2 years
    Actually this should be: %(sname).10s