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

Форматирование строк в стиле printf в Python

Важно. Операции форматирования, описанные здесь, демонстрируют различные причуды, которые приводят к ряду распространенных ошибок, таких как неправильное отображение кортежей и словарей. Использование более новых форматированных строковых литералов, метода str.format() или строк шаблона может помочь избежать этих ошибок. Каждая из этих альтернатив обеспечивает свои собственные компромиссы и преимущества простоты, гибкости или расширяемости.


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

Спецификатор преобразования содержит два или более символов и содержит следующие компоненты, которые должны выполняться в следующем порядке:

  1. Символ %, который отмечает начало спецификатора.
  2. Ключ сопоставления (необязательно), состоящий из заключенной в скобки последовательности символов, например, (somename).
  3. Флаги преобразования (необязательно), которые влияют на результат некоторых типов преобразования.
  4. Минимальная ширина поля (необязательно). Если указано как '*'- звездочка, фактическая ширина считывается из следующего элемента кортежа в значениях и объект для преобразования следует после минимальной ширины поля и необязательной точности.
  5. Точность (необязательно), задается как '.' - точка, за которой следует точность. Если указано как '*' - звездочка, фактическая точность считывается из следующего элемента кортежа в значениях, а значение для преобразования следует после точности.
  6. Модификатор длины (необязательно).
  7. Тип конверсии.

Если правым аргументом является словарь или другой тип сопоставления, то форматы в строке должны включать заключенный в скобки ключ сопоставления этому словарю, вставленный сразу после символа %. Ключ выбирает значение словаря, которое будет отформатировано.

Примеры форматирования строк в стиле printf.

# Применение словаря для форматирования
>>> print('%(language)s has %(number)03d quote types.' %
          {'language': 'Python', 'number': 2})
# Python has 002 quote types.

>>> language = 'Python'
>>> number = 2
>>> print('%s has %03d quote types.' % (language, number))
# Python has 002 quote types.

>>> print('%s has %d quote types.' % (language, number))
# Python has 2 quote types.

>>> a = 'Можно'
>>> b = 'так'
>>> x = '%s сделать %s ...'
>>> print(x % (a, b))
# Можно сделать так ...

В этом случае спецификаторы * - распаковки не могут встречаться в формате, так как они требуют последовательного списка параметров.

Символами флагов преобразований являются:

  • '#' - Преобразование значения будет использовать "альтернативную форму"
  • '0' - Преобразование будет дополнено нулями для числовых значений.
  • '-' - Преобразованное значение корректируется слева, отменяет '0' преобразование, если заданы оба.
  • ' ' - пробел. Пробел должен быть оставлен перед положительным числом или пустой строкой, полученным в результате преобразования со знаком.
  • '+' - Знак, '+' или '-', будет предшествовать преобразованию. Заменяет флаг "пробел".

Типы конверсии:

  • 'd' - Десятичное число со знаком
  • 'i' - Десятичное число со знаком
  • 'o' - Восьмеричное значение со знаком. Вызывает вставку восьмеричного спецификатора '0o' перед первой цифрой.
  • 'u' - Устаревший тип - он идентичен 'd'.
  • 'x', 'X' - Шестнадцатеричный формат. Перед первой цифрой вставляется начальная буква '0x' или '0X'
  • 'e', 'E' - Экспоненциальный формат с плавающей запятой.
  • 'f', 'F' - Десятичный формат с плавающей точкой. Cодержит десятичную точку, даже если за ней нет цифр.
  • 'g', 'G' - Формат с плавающей точкой. Использует экспоненциальный формат в нижнем регистре, если показатель степени меньше -4, в противном случае используется десятичный формат. Всегда содержит десятичную точку, а завершающие нули не удаляются.
  • 'c' - Один символ. Принимает целое число или одну строку символов.
  • 'r' - Строка. Преобразует любой объект Python, используя встроенную функцию repr(). Если точность равна N, вывод усекается до N символов.
  • 's' - Строка. Преобразует любой объект Python, используя встроенную класс str().
  • 'a' - Строка. Преобразует любой объект Python, используя встроенную функцию ascii().
  • '%' - Никакой аргумент не преобразуется, в результате получается символ '%'.

Поскольку строки Python имеют явную длину, %s преобразования не предполагают, что '\0' это конец строки.

Изменено в Python-3.1: %f преобразования для чисел, абсолютное значение которых превышает 1e50, больше не заменяются %g преобразованиями.