Форматирование в Python с помощью format()

Строковый метод format() форматирует строки python для более красивого вывода.

Синтаксис метода:

template.format(p0, p1, ..., k0=v0, k1=v1, ...)

Здесь p0, p1,... — это позиционные аргументы, а k0, k1,... — аргументы-ключевые слова со значениями v0, v1,... соответственно.

А template — это набор строк с заполнителями для аргументов.

Параметры format()

Метод format() принимает любое количество параметров. Но они делятся на два вида:

  • Позиционные аргументы — список параметров, доступ к которым можно получить по индексу параметра в фигурных скобках {индекс}.
  • Параметры — ключевые слова — список параметров типа ключ=значение, доступ к которым можно получить с помощью ключа параметра в фигурных скобках {ключ}.

Возвращаемое значение format()

Метода format() возвращает отформатированную строку.

Как работает format()?

Формат читает тип переданных аргументов и форматирует строку в соответствии с кодами форматирования в строке.

Для позиционных аргументов

format() для позиционных аргументов

Здесь Аргумент 0 — это строка “Adam”, а Аргумент 1 — число с плавающей точкой 230.2346.

Список аргументов в Python начинается с 0.

Строка Hello {0}, your balance is {1:9.3f} — это шаблон строки. Он содержит коды форматирования.

Фигурные скобки — это всего лишь заполнители, которые будут заменены аргументами. В примере выше {0} — это заполнитель для "Adam", а {1:9.3f} — для 230.2346.

Поскольку шаблон строки ссылается на аргументы format() ({0} и {1}), они являются позиционными аргумента. На них можно ссылаться без использования чисел, а Python конвертирует {} в числа автоматически.

Что происходит:

  • Поскольку "Adam" — это нулевой аргумент, он располагается в позиции {0}. Поскольку {0} не содержит других кодов форматирования, дополнительные операции не осуществляются.
  • Но в случае с первым аргументом, 230.2346, ситуация другая. {1:9.3f} размещает 230.2346 на нужно месте и выполняет операцию 9.3f.
  • f определяет, что это формат числа с плавающей точкой. Если указать неправильно, будет ошибка.
  • Часть до точки (9) определяет минимальную ширину, которую может занимать число 230.2346. В этом случае числу 230.2346 выделены 9 мест с точкой.
    Если параметр выравнивания не указан, то он выравнивается вправо до оставшихся позиций (для строк — влево).
  • Часть после точки (3) урезает десятичную часть (2346) до указанной числа. В этом случае 2346 может занимать три места. Остаток (46) округляется и выходит 235.

Для аргументов-ключевых слов

format() для аргументов-ключевых слов

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

Здесь вместо просто параметров использованы сочетания ключ-значение. А именно: name="Adam" и blc=230.2346.

Поскольку ссылка на эти параметры происходит через ключи ({name} и {blc:9.3f}) — это именованные аргументы.

Что происходит внутри:

  • Заполнитель {name} заменяется значением ключа name — “Adam”. Никаких дополнительных операций здесь нет.
  • В случае с аргументом blc=230.2346 заполнитель {blc:9.3f} заменяется на значение 230.2346. Но перед заменой производится операция 9.3f.
    Вывод — “230.235”. Десятичная часть обрезается после трех позиций, а оставшиеся цифры округляются. Общая ширина — 9, а два символа остаются справа.

Базовое форматирование с format()

Метод format() позволяет использовать простые заполнители для форматирования.

Пример №1: базовое форматирование для аргументов по умолчанию, позиционных и аргументов-ключевых слов.

# аргументы по умолчанию
print("Hello {}, your balance is {}.".format("Adam", 230.2346))

# позиционные аргументы
print("Hello {0}, your balance is {1}.".format("Adam", 230.2346))

# аргументы ключевые слова 
print("Hello {name}, your balance is {blc}.".format(name="Adam", blc=230.2346))

# смешанные аргументы
print("Hello {0}, your balance is {blc}.".format("Adam", blc=230.2346))

При запуске программы вывод будет одинаковым:

Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.

При использовании смешанных аргументов аргументы-ключевые слова должны идти после позиционных аргументов.

Форматирование чисел с format()

С помощью спецификаторов формата можно форматировать и числа:

Типы форматирования чисел

ТипЗначение
dДесятичное число
cСоответствующий символ Unicode
bДвоичный формат
oВосьмеричный формат
xШестнадцатеричный формат (в нижнем регистре)
XШестнадцатеричный формат (в верхнем регистре)
nТо же, что и d, но использует местную настройку для разделения числа
eЭкспоненциальная запись (e в нижнем регистре)
EЭкспоненциальная запись (E в верхнем регистре)
fОтображать фиксированное количество знаков (по умолчанию 6)
FТо же, что и f, только отображает inf как INF, а nan как NAN
gОбщий формат. Округляет число до p значащих цифр (Точность по умолчанию: 6)
GТо же, что и g. Но переключается к E, если число очень большое
%Проценты. Делит на 100 и добавляет % в конце

Пример №2: простое форматирование чисел.

# целочисленные аргументы
print("The number is:{:d}".format(123))

# аргументы с плавающей точкой
print("The float number is:{:f}".format(123.4567898))

# восьмеричный, двоичный и шестнадцатеричный формат
print("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(12))

При запуске этой программы вывод будет следующий:

The number is: 123
The number is:123.456790
bin: 1100, oct: 14, hex: c

Пример №3: форматирование чисел с полями для целых и чисел с плавающей точкой.

# целые числа с минимальной шириной
print("{:5d}".format(12))

# ширина не работает для чисел длиннее заполнения
print("{:2d}".format(1234))

# заполнение для чисел с плавающей точкой
print("{:8.3f}".format(12.2346))

# целые числа с минимальной шириной, заполненные нулями
print("{:05d}".format(12))

# заполнение для чисел с плавающей запятой, заполненных нулями
print("{:08.3f}".format(12.2346))

Эта программа выдаст следующее:

  12
1234
  12.235
00012
0012.235

Здесь:

  • В первой инструкции {:5d} принимает целое число в качестве аргумента и задает минимальную ширину 5. Поскольку настройка выравнивания не задана, оно выравнивается к правому краю.
  • Во втором ширина (2) меньше, чем размер числа (1234), поэтому слева не появляется свободное пространство, но число и не обрезается.
  • В отличие от целых чисел у чисел с плавающей точкой есть целая и десятичная части. Минимальная ширина в этом случае включает обе из них и точку.
  • В третьем выражении {:8.3f} обрезает десятичную часть, округляя ее до 2 цифр. И число, теперь 12.235, занимает 8 позиций, оставляя 2 пустых местах слева.
  • Если нужно заполнить оставшиеся места нулями, спецификатор может сделать и это. Это работает как для целых чисел, так и для чисел с плавающей точкой: {:05d} и {:08.3f}.

Пример №4: форматирование чисел со знаками.

# показать знак +
print("{:+f} {:+f}".format(12.23, -12.23))

# показать знак - 
print("{:-f} {:-f}".format(12.23, -12.23))

# показать место для знака +
print("{: f} {: f}".format(12.23, -12.23))

Вывод будет следующий:

+12.230000 -12.230000
12.230000 -12.230000
 12.230000 -12.230000

Форматирование чисел с выравниванием

Операторы <, ^, > и = используются для выравнивания в том случае, если указана конкретная ширина.

Форматирование чисел с выравниванием

ТипЗначение
<Выравнивается по левому краю
^Выравнивается по центру
>Выравнивается по правому краю
=Сдвигает знаки (+ или -) к левой позиции

Пример №5: форматирование чисел с выравниванием по центру, левому и правому краю.

# целые числа с выравниванием по правому краю
print("{:5d}".format(12))

# числа с плавающей точкой с выравниванием по центру
print("{:^10.3f}".format(12.2346))

# выравнивание целого числа по левому краю заполнено нулями
print("{:<05d}".format(12))

# числа с плавающей точкой с выравниванием по центру
print("{:=8.3f}".format(-12.2346))

Вывод этой программы:

   12
  12.235  
12000
- 12.235

Выравнивание по левому краю с нулями для целых чисел может создать проблемы, как в случае с третьим примером, который возвращает 12000 вместо 12.


Форматирование строк с format()

Как и числа, строки можно форматировать с помощью format().

Пример №6: форматирование строк с полями и выравниванием.

# отступ строки с выравниванием по левому краю
print("{:5}".format("cat"))

# отступ строки с выравниванием по правому краю
print("{:>5}".format("cat"))

# заполнение строк с выравниванием по центру
print("{:^5}".format("cat"))

# заполнение строк с выравниванием по центру
# и '*' - символ заполнения
print("{:*^5}".format("cat"))

При запуске программы вывод будет следующим:

cat  
  cat
 cat 
*cat*

Пример №7: обрезание строк.

# обрезание строк до 3 букв
print("{:.3}.".format("caterpillar"))

# обрезание строк до 3 букв и заполнение
print("{:5.3}.".format("caterpillar"))

# обрезание строк до 3 букв,
# заполнение и выравнивание по центру
print("{:^5.3}.".format("caterpillar"))

Вывод будет следующим:

cat.
cat  .
 cat .

Форматирование элементов классов и словарей с format()

Python использует getattr() для элементов класса в форме “.age”. А __getitem__() — для элементов словаря в форме “[index]”.

Пример №8: форматирование элементов класса с format().

# определяем класс Person
class Person:
    age = 23
    name = "Adam"

# форматирование возраста
print("{p.name}'s age is: {p.age}".format(p=Person()))

Вывод этой программы:

Adam's age is: 23

Здесь объект Person передается как аргумент-ключевое слово p.

В шаблоне строки получают доступ к значениям name и age с помощью .name и .age.

Пример №9: форматирование элементов словаря с format().

# объявляем словарь person
person = {'age': 23, 'name': 'Adam'}

# форматирование возраста
print("{p[name]}'s age is: {p[age]}".format(p=person))

Вывод:

Adam's age is: 23

По аналогии с классом словарь person передается в качестве аргумента-ключевого слова p.

В шаблоне строки доступ к name и age получают с помощью [name] и [age].

Есть и более простой способ форматировать словари в Python с помощью str.fromat(**mapping).

# объявляем словарь person
person = {'age': 23, 'name': 'Adam'}

# форматирование возраста
print("{name}'s age is: {age}".format(**person))

Вывод:

Adam's age is: 23

* — это параметр формата (минимальная ширина поля).

Аргументы как параметры в format()

Параметры, такие как точность, выравнивание или символы заполнения можно передавать в качестве позиционных аргументов-ключевых слов.

Пример №10: динамическое форматирование.

# динамический шаблон формата строки
string = "{:{fill}{align}{width}}"

# передача кодов формата в качестве аргументов
print(string.format('cat', fill='*', align='^', width=5))

# динамический шаблон формата float
num = "{:{align}{width}.{precision}f}"

# передача кодов формата в качестве аргументов
print(num.format(123.236, align='<', width=8, precision=2))

Вывод:

*cat*
123.24  

Здесь:

  • В первом пример “cat” — это позиционный аргумент, который будет отформатирован. Аналогично fill='*', align='^' и width=5 являются аргументами-ключевыми словами.
  • В шаблоне строки эти аргументы извлекаются не как обычные строки для вывода, а как коды форматирования: fill, align и width.
    Эти аргументы заменяют соответствующие заполнители, а строка “cat” соответствующим образом форматируется.
  • Во втором примере 123.236 — это позиционный аргумент, а align, with и precision передаются в шаблон в качестве параметров форматирования.

Дополнительные параметры форматирования с format()

format() также поддерживает форматирования по типам, например, для datetime или форматирование сложных чисел. Он внутренне вызывает __format__() для datetime и получает доступ к атрибутам сложных чисел.


Можно запросто переопределить метод __format__() для любого объекта для создания собственного форматирования.

Пример №11: форматирование по типу с format() и переопределение метода _format().

import datetime
# datetime форматирование
date = datetime.datetime.now()
print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))

# форматирование комплексных чисел
complexNumber = 1+2j
print("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber))

# пользовательский метод __format__()
class Person:
    def __format__(self, format):
        if(format == 'age'):
            return '23'
        return 'None'

print("Adam's age is: {:age}".format(Person()))

Вывод:

It's now: 2020/01/18 12:19:24
Real part: 1.0 and Imaginary part: 2.0
Adam's age is: 23

Здесь

  • Для datetime:
    Текущий объект datetime передается в качестве позиционного аргумента методу format(). С помощью метода __format__() format() получает доступ к году, месяцу, дню, часу, минутам и секундам.
  • Для сложны чисел:
    1+2j конвертируется в объект ComplexNumber.
    Затем через доступ к атрибутам real и imag числа форматируются.
  • Переопределение format():
    Как и с datetime можно перезаписать метод __format__() для собственного форматирования, которое вернет возраст при попытке получить доступ через {:age}.

Также можно использовать функциональность __str__() и __repr__() объекта с условными обозначениями и format().

Как и __format__() можно запросто переопределять метода __str__() и __repr__() объекта.

Пример №12: условные обозначения str() и repr() (!r и !s) с format().

# __str__() и __repr__() сокращенно !r и !s
print("Quotes: {0!r}, Without Quotes: {0!s}".format("cat"))

# реализация для класса __str__() и __repr__()
class Person:
    def __str__(self):
        return "STR"
    def __repr__(self):
        return "REPR"

print("repr: {p!r}, str: {p!s}".format(p=Person()))

Вывод:

Quotes: 'cat', Without Quotes: cat
repr: REPR, str: STR