Python string formatting - limit string length, but trim string beginning
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.
Łukasz Rogalski
See my GitHub: https://github.com/rogalski See my LinkedIn: https://www.linkedin.com/in/lukasz-rogalski
Updated on July 06, 2020Comments
-
Ł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 over 9 yearsIts good to downvote if the answer is not helpful, but can any one educate me why is it so?
-
Jonathan Eunice over 9 yearsBingo. 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 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 over 9 yearsThe
.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 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 over 9 yearsYes, but that requirement can't be satisfied.
-
Alek Kowalczyk about 2 yearsActually this should be:
%(sname).10s