Сообщить об ошибке.

Способы форматирования текстовых строк в Python

Форматирование строки для печати или логирования

Часто вам требуется больший контроль над форматированием вывода, чем просто печать значений, разделенных пробелами. Есть несколько способов форматирования вывода:

  1. Форматирование f-строками.
  2. Форматирование методом str.format().
  3. Форматирование оператором '%' в стиле языка C.

Форматирование f-строками.

Форматированные строковые литералы, также называемые "f-строками" для краткости, позволяют включать значение выражений Python в строку, добавляя префикс к строке 'f' или 'F' и записывая выражения внутри строки как {expression}.

>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
# 'Results of the 2016 Referendum'

Необязательный спецификатор формата Mini-Language может следовать за выражением. Это позволяет лучше контролировать форматирование значения. Следующий пример округляет число до десяти после десятичного числа:

>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
# The value of pi is approximately 3.142.

Передача целого числа после ':' символа приведет к минимальному количеству символов в этом поле. Это полезно для выравнивания столбцов.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...     print(f'{name:10} ==> {phone:10d}')
...
# Sjoerd     ==>       4127
# Jack       ==>       4098
# Dcab       ==>       7678

Другие модификаторы могут использоваться для преобразования значения перед его форматированием. '!a' применяется ascii(), '!s' применяется str() и '!r' применяется repr():

>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
# My hovercraft is full of eels.

>>> print(f'My hovercraft is full of {animals!r}.')
# My hovercraft is full of 'eels'.

Поддержка f-строками спецификации формата Mini-Language.

>>> b = 2999
>>> pi = 3.1415926
>>> f'Pi={pi:.3f}, b={b:*^11.2f}'
# 'Pi=3.142, b=**2999.00**'

>>> print("\n".join(f'{a:{a}<{a}}' for a in range(1, 6)))
# 1
# 22
# 333
# 4444
# 55555

Форматирование методом str.format().

Основное использование str.format() метода выглядит следующим образом:

>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
# We are the knights who say "Ni!"

>>> yes_votes = 42_572_654
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
# ' 42572654 YES votes  49.67%'

Скобки и символы внутри них, называемые полями формата, заменяются объектами, переданными в метод str.format(). Число в скобках может использоваться для обозначения позиции объекта.

>>> print('{0} and {1}'.format('spam', 'eggs'))
# spam and eggs

>>> print('{1} and {0}'.format('spam', 'eggs'))
# eggs and spam

Если в методе str.format() используются ключевые аргументы, на их значения ссылается имя аргумента.

>>> print('This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible'))
# This spam is absolutely horrible.

Позиционные и ключевые аргументы могут быть произвольно объединены:

>>> print('The story of {0}, {1}, and {other}.'.format(
...       'Bill', 'Manfred', other='Georg'))
# The story of Bill, Manfred, and Georg.

Если строка формата очень длинная, которую не хотите разделять, было бы неплохо, если бы вы могли ссылаться на переменные, которые должны быть отформатированы по имени, а не по позиции. Это можно сделать, передавая словарь dict и используя квадратные скобки '[]' для доступа к ключам.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...       'Dcab: {0[Dcab]:d}'.format(table))
# Jack: 4098; Sjoerd: 4127; Dcab: 8637678

Это также можно сделать, передав переменную словаря table в качестве аргументов ключевого слова с обозначением ** - знака распаковки словаря.

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
# Jack: 4098; Sjoerd: 4127; Dcab: 8637678

Это особенно полезно в сочетании со встроенной функцией vars(), которая возвращает словарь, содержащий все локальные переменные.

Как пример, следующий код производит аккуратно выровненный набор столбцов, дающих целые числа и их квадраты и кубы:

>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
#  1   1    1
#  2   4    8
#  3   9   27
#  4  16   64
#  5  25  125
#  6  36  216
#  7  49  343
#  8  64  512
#  9  81  729
# 10 100 1000

Форматирование оператором '%' в стиле языка C.

Оператор '%' также может использоваться для форматирования строк. Он интерпретирует левый аргумент так же, как строку формата sprintf() языка C, применяемую к правому аргументу и возвращает строку, полученную в результате этой операции форматирования. Например:

>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
# The value of pi is approximately 3.142.

Дополнительную информацию по данному способу форматирования можно найти в разделе "Форматирование строк в стиле printf".