format関数による文字列フォーマット(新しい形式 / 3.6対応)

Python2.6から使用可能なstr.format関数。旧来の%形式の文字列フォーマットよりも好ましい書き方。

波括弧で囲まれたフィールドにパラメータを埋め込んで文字列を指定する。波括弧自体を扱う場合は二重に記述してエスケープする。{{, }}
詳細について 6.1.3. 書式指定文字列の文法

またPython3.6からフォーマット関数と同等の機能をもつ フォーマット済み文字列リテラル(f-string) が導入されました。※後述

埋め込み

>>> "A={0}.".format("John")
#インデックスを指定して埋め込み
'A=John.'
>>> "A={0}. B={1}".format("John", "Taro")
'A=John. B=Taro'

# キーワード引数で指定
>>> "A={ab}. B={cd}".format(ab="John", cd="Taro")
'A=John. B=Taro'

# ディクショナリで指定する場合はアンパックすればよい
>>> d = {"a": "John", "b": 20}
>>> "A={a}. B={b}.".format(**d)
        #アンパックしてキーワード引数に
"A=John. B=20."

# 属性の取得
>>> class Person:
...   def __init__(self, name, age):
...     self.name = name
...     self.age = age
... 
>>> p = Person('John', 25)
>>> p.name
'John'
>>> "A={0.name}. B={0.age}.".format(p)
        #p.name, p.ageを埋め込み
"A=John. B=25."

書式指定

書式指定の詳細は、こちらを参照。
6.1.3.1. 書式指定ミニ言語仕様

# 幅指定
>>> "{0:<10}".format("Hello") 
#10文字幅。左寄せ
'Hello     '
>>> "{0:^10}".format("Hello") 
#10文字幅。センタリング
'  Hello   '
>>> "{0:>10}".format("Hello") 
#10文字幅。右寄せ
'     Hello'
>>> "{0:_>10}".format("Hello") 
# 詰め文字に_を指定。10文字幅。右寄せ
'_____Hello'
>>> "{0:0>6}".format(123) #前ゼロ埋め
'000123'


# 数値(10進, 16進, 8進, 2進)
>>> "int: {0:d};  hex: {0:X};".format(42)
'int: 42;  hex: 2A;'
>>> "oct: {0:o};  bin: {0:b}".format(42)
oct: 52;  bin: 101010'
# 数値 3桁カンマ区切り (Python2.7以降)
>>> "{0:,d}".format(1234567)
'1,234,567'
# 固定小数点3桁
>>> "{0:.3f}".format(12.34)
'12.340'

# 日付フォーマット
>>> import datetime
>>> d = datetime.datetime.now()
>>> "{0:%Y-%m-%d %H:%M:%S}".format(d)
'2012-10-07 08:15:03'

日付フォーマット文字列はここを参照。
https://docs.python.org/ja/3/library/time.html#time.strftime

Directive Meaning Notes
%a ロケールにおける省略形の曜日名。
%A ロケールにおける省略なしの曜日名。
%b ロケールにおける省略形の月名。
%B ロケールにおける省略なしの月名。
%c ロケールにおける適切な日付および時刻表現。
%d 月の始めから何日目かを表す 10 進数 [01,31]。
%H (24 時間計での) 時を表す 10 進数 [00,23]。
%I (12 時間計での) 時を表す 10 進数 [01,12]。
%j 年の初めから何日目かを表す 10 進数 [001,366]。
%m 月を表す 10 進数 [01,12]。
%M 分を表す 10 進数 [00,59]。
%p ロケールにおける AM または PM に対応する文字列。 (1)
%S 秒を表す 10 進数 [00,61]。 (2)
%U 年の初めから何週目か (日曜を週の始まりとします)を表す
10 進数 [00,53]。年が明けてから最初の日曜日までの全ての
曜日は 0 週目に属すると見なされます。
(3)
%w 曜日を表す 10 進数 [0(日曜日),6]。
%W 年の初めから何週目か (日曜を週の始まりとします)を表す
10 進数 [00,53]。年が明けてから最初の月曜日までの全ての
曜日は 0 週目に属すると見なされます。
(3)
%x ロケールにおける適切な日付の表現。
%X ロケールにおける適切な時刻の表現。
%y 上 2 桁なしの西暦年を表す 10 進数 [00,99]。
%Y 上 2 桁付きの西暦年を表す 10 進数。
%Z タイムゾーンの名前 (タイムゾーンがない場合には空文字列)。
%% 文字 “%” 自体の表現。

Python3.6以降のフォーマット済み文字列リテラル(f-string)

Python3.6からformat関数を使わなくても、fで始まる文字列リテラルf"" で簡単に文字列埋め込みができるようになりました。

フォーマット済み文字列リテラル(f-string)

>>> foo=123
>>> bar="Hello"
>>> f"{foo:0>4}: {bar}"
'0123: Hello'

fで始まる文字列リテラルを使うだけで書式指定などはformat関数と同様です。参照可能な変数名を埋め込むことができます。

関連記事:

4 thoughts on “format関数による文字列フォーマット(新しい形式 / 3.6対応)

  1. ピンバック: [maya] python:文字列フォーマット操作、%演算子 | CG Anatomy

  2. ピンバック: Raspberry PiでSQLiteとGoogle Chart – Atelier d' OFCOURSE

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)