Python 字符串格式化 - 限制字符串长度,但修剪字符串开头

问题描述 投票:0回答:4

我正在使用带有自定义格式化程序的 Python 标准日志记录模块,我在其中限制了某些字段的长度。它使用标准的

%
Python 运算符。

我可以像这样对百分比格式的字符串应用限制(这将长度限制为 10 个字符):

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

是否有可能从一开始就修剪它,所以输出是

'orem Ipsum'
没有操纵右侧参数)?

python string logging truncate
4个回答
11
投票

是否可以从头开始使用 % 格式进行修剪?

Python 的 % 格式来自 C 的 printf.

请注意,

.
表示浮点数的精度。它适用于字符串只是一个副作用,不幸的是,在字符串格式规范中没有规定将字符串从左侧剥离 到固定的最大宽度。

因此,如果你必须将一个字符串从末尾剥离到固定宽度,我建议从负索引开始切片。这个操作是健壮的,如果字符串少于 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'

(星号,“

*
”,是填充字符。)


11
投票

这可以通过切片轻松完成,因此您不需要任何字符串格式操作来完成您的工作

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

3
投票

我有同样的问题,并使用 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

可以将截断的名称存储在 record.name 中,但我也想保留原始名称。


0
投票

相当于现代 Python 中的

"%.10s" % "Lorem Ipsum"
是:

使用

str.format

"{:.10}".format("Lorem Ipsum")

使用 f 弦:

text = "Lorem Ipsum"
f"{text:.10}"
© www.soinside.com 2019 - 2024. All rights reserved.