如何使用str.format截断并填充python3?

时间:2018-02-01 09:52:31

标签: python string python-3.x

我想这样做:

'{pathname:>90}'.format(pathname='abcde')[-2:]

使用字符串格式而不是数组索引。 结果就是'de' 或者在pathname ='e'的情况下,结果将是'e',在e之前有一个空格。如果索引为[2:],则How to truncate a string using str.format in Python?

将回答此问题

我在以下示例中需要这个:

import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO,style='{',format='{pathname:>90}{lineno:4d}{msg}')
logging.info('k')

1 个答案:

答案 0 :(得分:3)

精确技巧(使用精确格式)不起作用。仅用于截断字符串的结尾。

解决方法是在将传递给str.format之前将字符串切片:

>>> '{pathname:>2}'.format(pathname='abcde'[-2:])
'de'
>>> '{pathname:>2}'.format(pathname='e'[-2:])
' e'

由于你无法控制传递给format的参数,你可以创建一个str的子类并重新定义格式,这样当它在关键字参数中遇到pathname时它会被截断,然后调用原始的str.format方法。

小型自足示例:

class TruncatePathnameStr(str):
    def format(self,*args,**kwargs):
        if "pathname" in kwargs:
            # truncate
            kwargs["pathname"] = kwargs["pathname"][-2:]
        return str.format(self,*args,**kwargs)

s = TruncatePathnameStr('##{pathname:>4}##')

print(s.format(pathname='abcde'))

打印:

##  de##

在现实生活中使用它:

logging.basicConfig(stream=sys.stdout, level=logging.INFO,style='{',
                    format=TruncatePathnameStr('{pathname:>90}{lineno:4d}{msg}'))