web-dev-qa-db-ja.com

Python文字列のフォーマット-文字列の長さを制限しますが、文字列の先頭をトリムします

Pythonカスタムフォーマッターを備えた標準のログモジュールを使用しており、一部のフィールドの長さを制限しています。標準の% Python演算子を使用しています。

このようにパーセント形式の文字列に制限を適用できます(これにより長さが10文字に制限されます):

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

最初からトリミングすることは可能ですか?出力は'orem Ipsum'右側の引数を操作せずに)ですか?

9

%フォーマットで最初からトリミングすることは可能ですか?

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'

(アスタリスク、 "* "は、塗りつぶし文字です。)

7
Aaron Hall

これはスライスによって簡単に実行できるため、JOBを実行するために文字列形式を操作する必要はありません。

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

私は同じ質問をし、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に保存することは可能ですが、元の名前も保持したかったのです。

2
Martin Wallgren