情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Pythonで文字列に値を埋め込む

Pythonで文字列に値を埋め込むには下のような方法があります。

  • 書式付き文字列リテラル
  • formatメソッド
  • テンプレート文字列(string.Templateクラス)
  • %演算子

書式付き文字列リテラル

文字列には式を埋め込むことができます。

埋め込まれた式は実行時に評価され、評価された結果が文字列に埋め込まれることになります。

文字列に式を埋め込むには文字列の表現の先頭にfまたはFを付加し、式を{}で囲んだものを文字列に埋め込みます。

例:

>>> a = 123
>>> b = 456
>>> c = 789
>>> print(f'a + b + c = {a + b + c}, a * b * c = {a * b * c}')
a + b + c = 1368, a * b * c = 44253432

ただし、空の式を埋め込むことはできません。

例:

>>> print(f'{}')
  File "<stdin>", line 1
SyntaxError: f-string: empty expression not allowed

また、ラムダ式を埋め込む場合には()で囲まなければなりません。

>>> print(f'{lambda x: x}')
  File "<fstring>", line 1
    ( lambda x)
              ^
SyntaxError: unexpected EOF while parsing
>>> print(f'{(lambda x: x)}')
<function <lambda> at 0x0000007AA4D29730>

また、文字の連なりに{が含まれる場合には{{{に置き換え、}が含まれる場合には}}}に置き換えなければなりません。

例:

>>> print(f'{{}}')
{}

また、文字の連なりを'で囲む場合には式には'が含まれてはなりませんし、"で囲む場合には"が含まれてはなりませんし、'''で囲む場合には'''が含まれてはなりませんし、"""で囲む場合には"""が含まれてはなりません。

例:

>>> print(f'{'yurina'}')
  File "<stdin>", line 1
    print(f'{'yurina'}')
                   ^
SyntaxError: invalid syntax
>>> print(f'{"yurina"}')
yurina
>>> print(f"{"yurina"}")
  File "<stdin>", line 1
    print(f"{"yurina"}")
                   ^
SyntaxError: invalid syntax
>>> print(f"{'yurina'}")
yurina
>>> print(f'''{'''yurina'''}''')
  File "<stdin>", line 1
    print(f'''{'''yurina'''}''')
                       ^
SyntaxError: invalid syntax
>>> print(f'''{'yurina'}''')
yurina
>>> print(f"""{"""yurina"""}""")
  File "<stdin>", line 1
    print(f"""{"""yurina"""}""")
                       ^
SyntaxError: invalid syntax
>>> print(f"""{"yurina"}""")
yurina

また、式の中で\を使用することはできません。

例:

>>> print(f'{'foo\\bar'}')
  File "<stdin>", line 1
    print(f'{'foo\\bar'}')
                ^
SyntaxError: invalid syntax

式が評価された結果が文字列に埋め込まれる前にはstr関数やrepr関数やascii関数を呼び出すことができます。str関数を呼び出すには式の末尾に!sを付加し、repr関数を呼び出すには!rを付加し、ascii関数を呼び出すには!aを付加します。

例:

>>> name = 'yurina'
>>> print(f'I\'m {name!r}')
I'm 'yurina'

また、式が評価された結果に書式を指定する場合には式の末尾に:と書式(後述)を付加します。

例:

>>> value = 12.34567
>>> print(f'value = {value:10.4}')
value =      12.35

書式の中にも式を埋め込むことができます。

例:

>>> width = 10
>>> precision = 4
>>> value = 12.34567
>>> print(f'value = {value:{width}.{precision}}')
value =      12.35

式の末尾に付加された!s!r!aによりstr関数やrepr関数やascii関数が呼び出された結果に書式を指定する場合には!s!r!aの後に:と書式(後述)を付加します。

例:

>>> name = 'yurina'
>>> print(f'I\'m {name!r:>16}')
I'm         'yurina'

formatメソッド

文字列のformatメソッドを使用すると文字列に値を埋め込むことができます。

formatメソッドには普通の引数として0個以上の文字列に埋め込む値を指定することができます。これらの引数には1番目の引数から順番に0から始まる番号が割り当てられます。

また、キーワード引数として0個以上の文字列に埋め込む値を指定することができます。

返り値として値が埋め込まれた文字列が得られます。

文字列中の値を埋め込む部分には値の番号または引数名を{}で囲んで記述します。ただし、普通の引数として指定された値の順番と文字列中にそれらの値を埋め込む順番が同じである場合には値の番号を省略することができます。

例:

>>> '{0}, {1}, {2}'.format('cat', 'dog', 'rabbit')
'cat, dog, rabbit'
>>> '{2}, {1}, {2}'.format('cat', 'dog', 'rabbit')
'rabbit, dog, rabbit'
>>> '{}, {}, {}'.format('cat', 'dog', 'rabbit')
'cat, dog, rabbit'
>>> '{rat}, {fox}'.format(rat='rat', fox='fox')
'rat, fox'
>>> '{fox}, {rat}, {fox}'.format(rat='rat', fox='fox')
'fox, rat, fox'
>>> '{}, {}, {}, {rat}, {fox}'.format('cat', 'dog', 'rabbit', rat='rat', fox='fox')
'cat, dog, rabbit, rat, fox'

値そのものを文字列に埋め込むのではなく、値の属性を埋め込むには値の番号または引数名の後に.と属性名を記述し、値の要素を埋め込むには要素の番号を[]で囲んで記述します。

例:

>>> class Animal:
...     cat = 'cat'
...     dog = 'dog'
...     rabbit = 'rabbit'
...
>>> '{0.cat}, {0.rabbit}, {1[1]}'.format(Animal(), ['rat', 'fox'])
'cat, rabbit, fox'
>>> '{.dog}, {[0]}'.format(Animal(), ['rat', 'fox'])
'dog, rat'
>>> class Animal2:
...     animals = Animal()
...     animals2 = ('rat', 'fox')
...
>>> '{animals.animals.dog}, {animals.animals2[1]}'.format(animals=Animal2())
'dog, fox'

値が文字列に埋め込まれる前にはstr関数やrepr関数やascii関数を呼び出すことができます。str関数を呼び出すには値の番号や引数名の末尾に!sを付加し、repr関数を呼び出すには!rを付加し、ascii関数を呼び出すには!aを付加します。

例:

>>> class C:
...     def __str__(self):
...         return 'this is an instance of C'
...
>>> '{0}'.format(C())
'this is an instance of C'
>>> '{0!s}'.format(C())
'this is an instance of C'
>>> '{0!r}'.format(C())
'<__main__.C object at 0x000000A455B2BC10>'
>>> '{0!a}'.format(C())
'<__main__.C object at 0x000000A455B2BC10>'

また、値に書式を指定する場合には値の番号や引数名の末尾に:と書式(後述)を付加します。

例:

>>> '{1:<16}|{0:>16}'.format('right', 'left')
'left            |           right'

書式の中にも値を埋め込むことができます。

例:

>>> '{1:<{width}}|{0:>{width}}'.format('right', 'left', width=24)
'left                    |                   right'
>>> '{1:<{width}}|{0:>{width}}'.format('right', 'left', width=32)
'left                            |                           right'

値の番号や引数名の末尾に付加された!s!r!aによりstr関数やrepr関数やascii関数が呼び出された結果に書式を指定する場合には!s!r!aの後に:と書式(後述)を付加します。

例:

>>> 'I\'m {name!r:>16}'.format(name='yurina');
"I'm         'yurina'"

なお、文字列中の値を埋め込まない部分に{が含まれる場合には{{{に置き換え、}が含まれる場合には}}}に置き換えなければなりません。

例:

>>> '{{{0}}}'.format(1)
'{1}'

書式

書式には下のような要素を順番に記述することができます。

  • 配置
  • 符号
  • 代替形式
  • 区切り
  • 精度

配置

配置を指定するために下のような値を記述することができます。

  • <・・・左寄せとなります。数値以外に対するデフォルトです。
  • >・・・右寄せとなります。数値に対するデフォルトです。
  • =・・・符号を左端に配置し、それ以外を右端に配置します。数値に対してしか意味がありません。
  • ^・・・中央寄せとなります。

これらの値の直前には余白を埋める文字を指定することができます。デフォルトは空白文字です。

例:

>>> '{0:<16}'.format(-5.55)
'-5.55           '
>>> '{0:>16}'.format(-5.55)
'           -5.55'
>>> '{0:=16}'.format(-5.55)
'-           5.55'
>>> '{0:^16}'.format(-5.55)
'     -5.55      '
>>> '{0:-^16}'.format('center')
'-----center-----'

符号

符号を表示するかを指定するために下のような値を記述することができます。数値に対してしか意味がありません。

  • +・・・正数に対しても負数に対しても符号を表示します。
  • -・・・負数に対してしか符号を表示しません。デフォルトです。
  • 空白文字・・・負数に対してしか符号を表示しませんが、正数に対しては先頭に1文字の空白文字を付加します。

例:

>>> '{0:+}'.format(5.55)
'+5.55'
>>> '{0:-}'.format(5.55)
'5.55'
>>> '{0: }'.format(5.55)
' 5.55'

代替形式

代替形式で表示するには#を記述します。

整数を2進数、8進数、16進数表記で表示する場合には先頭にそれぞれ0b0o0xまたは0Xが付加されます。

固定小数点数として表示する場合には小数点以下の値がなくても小数点が表示され、小数点以下の精度までの桁がなくても0が表示されます。

例:

>>> '{0:#b}'.format(255)
'0b11111111'
>>> '{0:#o}'.format(255)
'0o377'
>>> '{0:#x}'.format(255)
'0xff'
>>> '{0:#X}'.format(255)
'0XFF'
>>> '{0:#f}'.format(255)
'255.000000'
>>> '{0:#g}'.format(255)
'255.000'
>>> '{0:#f}'.format(5.55)
'5.550000'
>>> '{0:#g}'.format(5.55)
'5.55000'

最小幅を指定するために整数を記述することができます。

配置を記述しなかった場合には整数の直前に0を付加することができます。この場合、配置を0=と記述したものと見做されます。

例:

>>> '{0:16}'.format(-5.55)
'           -5.55'
>>> '{0:016}'.format(-5.55)
'-000000000005.55'

区切り

桁の区切り方法を指定するために下のような値を記述することができます。数値に対してしか意味がありません。

  • ,・・・3桁ごとに,で区切ります。
  • _・・・整数を10進数表記で表示する場合や固定小数点数として表示する場合には整数部を3桁ごとに_で区切ります。整数を2進数、8進数、16進数表記で表示する場合には4桁ごとに_で区切ります。

例:

>>> '{0:,}'.format(65535)
'65,535'
>>> '{0:_}'.format(65535)
'65_535'
>>> '{0:_f}'.format(65535)
'65_535.000000'
>>> '{0:_g}'.format(65535)
'65_535'
>>> '{0:_b}'.format(65535)
'1111_1111_1111_1111'
>>> '{0:_o}'.format(65535)
'17_7777'
>>> '{0:_x}'.format(111111111111)
'19_debd_01c7'
>>> '{0:_X}'.format(111111111111)
'19_DEBD_01C7'

精度

精度を指定するために.の後に整数を記述することができます。数値に対してしか意味がありません。

型がgGnである場合には全体の精度となります。

それ以外の場合には小数点以下の精度となります。

例:

>>> '{0:.3e}'.format(-55555.55555)
'-5.556e+04'
>>> '{0:.3f}'.format(-55555.55555)
'-55555.556'
>>> '{0:.3g}'.format(-55555.55555)
'-5.56e+04'
>>> '{0:.3n}'.format(-55555.55555)
'-5.56e+04'

型を指定するために下のような値を記述することができます。

整数に対しては下のような値を記述することができます。

  • d・・・10進数表記で表示します。
  • n・・・10進数表記で表示します。ただし、桁の区切りを行います。
  • b・・・2進数表記で表示します。
  • o・・・8進数表記で表示します。
  • x・・・16進数表記で表示します。ただし、9以降の数字としてaからfを使用します。
  • X・・・16進数表記で表示します。ただし、9以降の数字としてAからFを使用します。
  • c・・・整数をユニコードコードポイントとして解釈した場合の文字として表示します。

例:

>>> '{0:d}'.format(65535)
'65535'
>>> '{0:b}'.format(65535)
'1111111111111111'
>>> '{0:o}'.format(65535)
'177777'
>>> '{0:x}'.format(65535)
'ffff'
>>> '{0:X}'.format(65535)
'FFFF'
>>> '{0:c}'.format(65535)
'\uffff'

数値に対しては下のような値を記述することができます。デフォルトの精度は6です。

  • e・・・指数表記で表示します。ただし、仮数と指数の間に表示する文字としてeを使用します。
  • E・・・指数表記で表示します。ただし、仮数と指数の間に表示する文字としてEを使用します。
  • f・・・固定小数点数として表示します。ただし、非数はnanと表示し、無限大はinfと表示します。
  • F・・・固定小数点数として表示します。ただし、非数はNANと表示し、無限大はINFと表示します。
  • g・・・指数表記または固定小数点数として表示します。ただし、仮数と指数の間に表示する文字としてeを使用し、非数はnanと表示し、無限大はinfと表示します。
  • G・・・指数表記または固定小数点数として表示します。ただし、仮数と指数の間に表示する文字としてEを使用し、非数はNANと表示し、無限大はINFと表示します。
  • n・・・指数表記または固定小数点数として表示します。ただし、仮数と指数の間に表示する文字としてeを使用し、非数はnanと表示し、無限大はinfと表示し、桁の区切りを行います。
  • %・・・百分率として表示します。ただし、非数はnanと表示し、無限大はinfと表示します。

例:

>>> '{0:e}'.format(65535.65535)
'6.553566e+04'
>>> '{0:E}'.format(65535.65535)
'6.553566E+04'
>>> '{0:f}'.format(65535.65535)
'65535.655350'
>>> '{0:F}'.format(65535.65535)
'65535.655350'
>>> '{0:g}'.format(65535.65535)
'65535.7'
>>> '{0:G}'.format(65535.65535)
'65535.7'
>>> '{0:%}'.format(65535.65535)
'6553565.535000%'

テンプレート文字列

テンプレート文字列により文字列への単純な値の埋め込みを行うことができます。

テンプレート文字列を利用するにはまずstring.Templateクラスのインスタンスを作成します。

第1引数に値を埋め込む文字列を指定します。

文字列の値を埋め込む部分には$の直後に値の名称を記述するか、値の名称を${}で区切ります。

また、$を文字列の一部として含める場合には$の代わりに$$と記述します。

そして、string.Templateクラスのインスタンスのsubstituteメソッドを呼び出します。

第1引数に文字列に埋め込む値を辞書(または辞書類似データ)として指定します。

辞書のそれぞれの要素のキーは値の名称とし、要素の値は文字列に埋め込む値とします。

あるいは、文字列に埋め込む値をキーワード引数として指定することもできます。

キーワード引数の名称を値の名称とし、キーワード引数の値を文字列に埋め込む値とします。

第1引数とキーワード引数を同時に指定することもできますが、第1引数とキーワード引数で同じ名称の値が重複して指定された場合にはキーワード引数の指定が優先されます。

ただし、文字列に埋め込む値が第1引数またはキーワード引数として指定されなかった場合にはKeyErrorエラーが発生します。

返り値として値が埋め込まれた文字列が得られます。

また、文字列に埋め込む値が第1引数またはキーワード引数として指定されなかった場合にエラーが発生しないようにするにはsubstituteメソッドの代わりにsafe_substituteメソッドを使用します。

safe_substituteメソッドを使用した場合には指定されなかった値の埋め込みは行われず、文字列中の値を埋め込む部分はそのままになります。

例:

>>> import string
>>> template = string.Template('My name is ${name}. I am ${age} years old.')
>>> template.substitute({'name': 'yurina', 'age': 29})
'My name is yurina. I am 29 years old.'
>>> template.substitute({'name': 'yurina'}, age=21)
'My name is yurina. I am 21 years old.'
>>> template.substitute({'name': 'yurina', 'age': 29}, age=21)
'My name is yurina. I am 21 years old.'
>>> template.substitute({'name': 'yurina'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\yurina\AppData\Local\Programs\Python\Python38\lib\string.py", line 126, in substitute
    return self.pattern.sub(convert, self.template)
  File "C:\Users\yurina\AppData\Local\Programs\Python\Python38\lib\string.py", line 119, in convert
    return str(mapping[named])
KeyError: 'age'
>>> template.safe_substitute({'name': 'yurina'})
'My name is yurina. I am ${age} years old.'

%演算子

%演算子は文字列に値を埋め込むための演算子です。

%演算子を利用するには%演算子の左側に値を埋め込む文字列を指定し、右側に文字列に埋め込む値を指定します。

文字列の値を埋め込む部分には%の直後に値をどのような種類の値として埋め込むかを下のような文字として記述します。

  • d・・・10進数表記の整数
  • i・・・10進数表記の整数
  • o・・・8進数表記の整数
  • x・・・16進数表記の整数(ただし、9以降の数字としてaからfを使用します)
  • X・・・16進数表記の整数(ただし、9以降の数字としてAからFを使用します)
  • e・・・指数表記の数値(ただし、仮数と指数の間に表示する文字としてeを使用します)
  • E・・・指数表記の数値(ただし、仮数と指数の間に表示する文字としてEを使用します)
  • f・・・固定小数点数
  • F・・・固定小数点数
  • g・・・指数表記の数値または固定小数点数(ただし、仮数と指数の間に表示する文字としてeを使用します)
  • G・・・指数表記の数値または固定小数点数(ただし、仮数と指数の間に表示する文字としてEを使用します)
  • c・・・1文字の文字列
  • r・・・文字列(ただし、文字列以外のデータを文字列に変換するためにはrepr関数を使用します)
  • s・・・文字列(ただし、文字列以外のデータを文字列に変換するためにはstr関数を使用します)
  • a・・・文字列(ただし、文字列以外のデータを文字列に変換するためにはascii関数を使用します)

また、%を文字列の一部として含める場合には%の代わりに%%と記述します。

文字列に埋め込む値が1つである場合には%演算子の右側にその値を指定し、2つ以上である場合にはタプルとして値を指定するか、辞書(または辞書類似データ)として指定します。タプルとして指定した場合には文字列中の値を埋め込む部分にタプルの要素が順番に埋め込まれ、辞書として指定した場合には値の名称に基づいて埋め込まれます。

例:

>>> '%d' % 65535
'65535'
>>> '%o' % 65535
'177777'
>>> '%x' % 65535
'ffff'
>>> '%X' % 65535
'FFFF'
>>> '%e' % 65535
'6.553500e+04'
>>> '%f' % 65535
'65535.000000'
>>> '%g' % 65535
'65535'
>>> '%d + %d = %d' % (123, 456, 123 + 456)
'123 + 456 = 579'

また、%と上の文字の間には下のような要素を順番に記述することができます。

  • 値の名称
  • 値の変換方法
  • 精度

値の名称

文字列に埋め込む値の名称を()で囲んで記述することができます。

例:

>>> 'my name is %(name)s.' % { 'name': 'yurina', 'age': 29 }
'my name is yurina.'

値の変換方法

値を文字列に埋め込む際の値の変換方法を指定するために下のような値を記述することができます。

  • #・・・整数を8進数、16進数表記で表示する場合にはそれぞれ0o0xまたは0Xが付加されます。固定小数点数として表示する場合には小数点以下の値がなくても小数点が表示され、小数点以下の精度までの桁がなくても0が表示されます。
  • 0・・・数値に対して0埋めを行います。
  • -・・・左寄せを行います。
  • 空白文字・・・正数に対して先頭に1文字の空白文字を付加します。
  • +・・・数値に対して符号を表示します。

例:

>>> '%#d' % 65535
'65535'
>>> '%#o' % 65535
'0o177777'
>>> '%#x' % 65535
'0xffff'
>>> '%#X' % 65535
'0XFFFF'
>>> '%#e' % 65535
'6.553500e+04'
>>> '%#f' % 65535
'65535.000000'
>>> '%#g' % 65535
'65535.0'
>>> '% d' % 65535
' 65535'
>>> '%+d' % 65535
'+65535'

最小幅を指定するために整数を記述することができます。

あるいは、*を記述することもできます。*を記述した場合には%演算子の右側に指定したタプルの現在の要素が最小幅となり、次以降の要素が文字列に埋め込まれる値となります。

例:

>>> '%10d' % 65535
'     65535'
>>> '%*d' % (10, 65535)
'     65535'

精度

精度を指定するために.の後に整数を記述することができます。数値に対してしか意味がありません。

あるいは、*を記述することもできます。*を記述した場合には%演算子の右側に指定したタプルの現在の要素が精度となり、次の要素が文字列に埋め込まれる値となります。

例:

>>> '%15.5f' % 65535
'    65535.00000'
>>> '%*.*f' % (15, 5, 65535)
'    65535.00000'
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-python