Перейти до змісту

Форматування рядків

При роботі з рядками часто виникають ситуації, коли в шаблон рядка треба підставити різні дані.

Це можна робити об'єднуючи частини рядка і дані, але в Python є більш зручний спосіб - форматування рядків.

Форматування рядків може допомогти, наприклад, у таких ситуаціях:

  • необхідно підставити значення в рядок за певним шаблоном
  • необхідно відформатувати вивід стовпцями
  • треба конвертувати числа у двійковий формат

Існує кілька варіантів форматування рядків:

  • з оператором % - старіший варіант
  • метод format - відносно новий варіант
  • f-рядки – новий варіант, який з'явився у Python 3.6

Так як для повноцінного пояснення f-рядків, треба показувати приклади з циклами та роботою з об'єктами, які ще не розглядалися, ця тема розглядається у розділі FIX REF

Форматування рядків із методом format

Приклад використання методу format:

In [1]: "interface FastEthernet0/{}".format('1')
Out[1]: 'interface FastEthernet0/1'

Спеціальний символ {} вказує на те, що сюди підставиться значення, яке передається методу format. При цьому кожна пара фігурних дужок позначає одне місце для підстановки значення.

Значення, що підставляються у фігурні дужки, можуть бути різного типу. Наприклад, це може бути рядок, число або список:

In [3]: print('{}'.format('10.1.1.1'))
10.1.1.1

In [4]: print('{}'.format(100))
100

In [5]: print('{}'.format([10, 1, 1, 1]))
[10, 1, 1, 1]

За допомогою форматування рядків можна виводити результат стовпцями. У форматуванні рядків можна вказувати, скільки символів виділено на дані. Якщо кількість символів у даних менша, ніж виділена кількість символів, відсутні символи заповнюються пробілами.

Наприклад, таким чином можна вивести дані стовпцями однакової ширини по 15 символів з вирівнюванням праворуч:

In [3]: vlan, mac, intf = ['100', 'aabb.cc80.7000', 'Gi0/1']

In [4]: print("{:>15} {:>15} {:>15}".format(vlan, mac, intf))
            100  aabb.cc80.7000           Gi0/1

Вирівнювання по лівій стороні:

In [5]: print("{:15} {:15} {:15}".format(vlan, mac, intf))
100             aabb.cc80.7000  Gi0/1

Приклади вирівнювання

git

git

git

Шаблон може бути багаторядковим:

ip_template = '''
IP address:
{}
'''

In [7]: print(ip_template.format('10.1.1.1'))

IP address:
10.1.1.1

За допомогою форматування рядків можна також впливати на відображення чисел.

Наприклад, можна вказати, скільки цифр після коми виводити:

In [9]: print("{:.3f}".format(10.0/3))
3.333

За допомогою форматування рядків можна конвертувати числа у двійковий формат:

In [11]: '{:b} {:b} {:b} {:b}'.format(192, 100, 1, 1)
Out[11]: '11000000 1100100 1 1'

При цьому, як і раніше, можна вказувати додаткові параметри, наприклад, ширину стовпця:

In [12]: '{:8b} {:8b} {:8b} {:8b}'.format(192, 100, 1, 1)
Out[12]: '11000000  1100100        1        1'

А також можна вказати, що треба доповнити числа нулями до вказаної ширини стовпця:

In [13]: '{:08b} {:08b} {:08b} {:08b}'.format(192, 100, 1, 1)
Out[13]: '11000000 01100100 00000001 00000001'

У фігурних дужках можна вказувати імена. Це дозволяє передавати аргументи в будь-якому порядку, а також робить шаблон зрозумілішим:

In [15]: '{ip}/{mask}'.format(mask=24, ip='10.1.1.1')
Out[15]: '10.1.1.1/24'

Ще одна корисна можливість форматування рядків – зазначення номера аргументу:

In [16]: '{1}/{0}'.format(24, '10.1.1.1')
Out[16]: '10.1.1.1/24'

За рахунок цього, наприклад, можна позбутися повторної передачі одних і тих же значень:

ip_template = '''
IP address:
{:<8} {:<8} {:<8} {:<8}
{:08b} {:08b} {:08b} {:08b}
'''

In [20]: print(ip_template.format(192, 100, 1, 1, 192, 100, 1, 1))

IP address:
192      100      1        1
11000000 01100100 00000001 00000001

У прикладі вище октети адреси доводиться передавати двічі - один відображення у десятковому форматі, а другий - для двійкового.

Вказавши індекси значень, які передаються методу format, можна позбутися дублювання:

ip_template = '''
IP address:
{0:<8} {1:<8} {2:<8} {3:<8}
{0:08b} {1:08b} {2:08b} {3:08b}
'''

In [22]: print(ip_template.format(192, 100, 1, 1))

IP address:
192      100      1        1
11000000 01100100 00000001 00000001