Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 16 из 20 Начальный 20 мин 120 XP

Выравнивание строк: ljust, rjust, center, zfill

ljust, rjust, center и zfill дотягивают строку до заданной ширины: ровные колонки прайса, заголовок по центру, номера заказов с ведущими нулями.

Редакция Питоники

Подсчёты из прошлого урока редко остаются в одну строчку: цены, количества и номера хочется видеть колонками, как в чеке. Пробелы руками добавлять не нужно — у строк есть четыре метода-«планировщика»: ljust, rjust, center и zfill. А в f-строках из урока 4 у них есть близнец — спецификации вроде {:<10}, о них в конце.

ljust и rjust: прижать к краям

s.ljust(ширина) дополняет строку пробелами справа, s.rjust(ширина) — слева. Аргумент один — итоговая длина: метод не «добавляет столько-то пробелов», а дотягивает строку до заданной ширины. Вторым необязательным аргументом можно передать любой символ-заполнитель вместо пробела.

колонки прайса
product = 'хлеб'
print(product.ljust(10) + '|')
print(product.rjust(10) + '|')
print(product.ljust(10, '.') + '|')
print('45'.rjust(6, '0'))
Вывод
хлеб      |
      хлеб|
хлеб......|
000045

Вертикальные черты добавлены только для наглядности: по ним видно, до какого места дотянута строка. Обрати внимание: считается вся длина результата, а не число добавленных символов — у слова из четырёх букв ljust(10) добавит шесть пробелов. Заполнитель 0 в паре с rjust уже напоминает про zfill, но у того есть фокус.

center: заголовок по центру

заголовок отчёта
print('ОТЧЁТ'.center(20))
print('ОТЧЁТ'.center(21))
print('ОТЧЁТ'.center(20, '-'))
Вывод
       ОТЧЁТ        
        ОТЧЁТ        
-------ОТЧЁТ--------

center делит недостающие позиции на два края, но поровну получается не всегда: при нечётной ширине лишний символ уходит влево, при чётной — вправо. Сравни первые две строки: у поля шириной 21 слева на один пробел больше. Этот приём хорош для шапок текстовых отчётов и «табличек» в консоли: заголовок по центру, данные — колонками через ljust и rjust.

zfill: ведущие нули

  • zfill(ширина) заполняет недостающие позиции нулями слева: '7'.zfill(4) даёт '0007';
  • аргумент — общая длина результата, а не количество нулей;
  • минус zfill бережёт: '-7'.zfill(5) даст '-0007', знак остаётся впереди;
  • работает метод со строкой: для числа сначала str(7).zfill(4).
номера заказов
for number in ['7', '45', '2026']:
    print('Заказ № ' + number.zfill(6))
Вывод
Заказ № 000007
Заказ № 000045
Заказ № 002026

Ни ljust, ни rjust, ни center никогда не обрезают строку: если она уже длиннее заданной ширины, метод вернёт её без изменений. Куда идти дальше: в уроке 17 разберём многострочные тексты, а в финальном проекте соберём отчёт с ровными колонками на этих методах.

Как выровнять текст в колонки в Python

Чек, прайс, отчёт — всё это таблицы, и таблица требует колонок. Пробелы руками расставлять не нужно: у строк есть четыре метода-планировщика, ljust, rjust, center и zfill, которые доводят строку до заданной ширины нужным способом. Разница между ними — в том, с какой стороны и чем заполнять.

колонки прайса
product = 'хлеб'
print(product.ljust(10) + '|')
print(product.rjust(10) + '|')
print(product.ljust(10, '.') + '|')
print('45'.rjust(6, '0'))
Вывод
хлеб      |
      хлеб|
хлеб......|
000045

Вертикальные черты добавлены только для наглядности: по ним видно, до какого места дотянута строка. Обратите внимание: считается вся длина результата, а не число добавленных символов — у слова из четырёх букв ljust(10) добавит шесть пробелов. Это главное отличие от ljust в некоторых других языках, где задают именно количество добавляемых символов.

center: заголовок по центру

center(ширина) ставит строку по центру поля, разделяя недостающие позиции между двумя краями. Но поровну получается не всегда: лишний символ уходит вправо. Это стоит знать, когда выравнивают заголовки таблиц и сравнивают их посимвольно.

заголовок отчёта
print('ОТЧЁТ'.center(20))
print('ОТЧЁТ'.center(21))
print('ОТЧЁТ'.center(20, '-'))
Вывод
       ОТЧЁТ        
        ОТЧЁТ        
-------ОТЧЁТ--------

Сравните первые две строки: у поля шириной 21 слева на один пробел больше. Этот приём хорош для шапок текстовых отчётов и «табличек» в консоли: заголовок по центру, данные — колонками через ljust и rjust. Заполнитель во втором аргументе превращает рамку из пробелов в рамку из дефисов.

zfill: ведущие нули

Отдельная задача — номера, которые должны выглядят одинаково: заказ № 000007 рядом с заказом № 002026. zfill(ширина) заполняет недостающие позиции нулями слева. Отличие от rjust с заполнителем '0' — в том, что zfill бережёт знак: минус остаётся впереди нулей.

номера заказов
for number in ['7', '45', '2026']:
    print('Заказ № ' + number.zfill(6))
Вывод
Заказ № 000007
Заказ № 000045
Заказ № 002026

Проверьте разницу на отрицательном числе: '-7'.zfill(5) даст '-0007' — минус впереди, нули после. А вариант '-7'.rjust(5, '0') даст '00-07', и это уже не число, а мусор. И ещё: zfill — метод строки, а не числа, поэтому сначала str(7).zfill(4).

Практика: таблица с колонками

Настоящая задача — вывести прайс, где колонки выровнены. Ширину колонки нужно вычислить по данным, а не задать с потолка: возьмите самое длинное значение и добавьте зазор.

выравнивание по максимальной длине
rows = [['хлеб', '45'], ['молоко', '89'], ['сыр', '540']]
width = max(len(name) for name, _ in rows)
print('Товар'.ljust(width) + 'Цена')
for name, price in rows:
    print(name.ljust(width) + price.rjust(6))
Вывод
Товар Цена
хлеб      45
молоко    89
сыр      540

Заголовок выровнен по той же ширине, что и данные, поэтому «Цена» встаёт над колонкой цифр. Ширину второй колонки я задал вручную — 6; если бы чисел стало больше, её тоже стоило бы считать: max(len(price) for _, price in rows) + 2. Разница между «посчитать ширину» и «захардкодить 10» проявляется, когда данные меняются: при фиксированной ширине длинное название съедет разделитель, а при вычисленной — таблица останется ровной.

МетодЧто делаетПример
s.ljust(w)дополняет пробелами справа до ширины w'кот'.ljust(6)
s.rjust(w)дополняет пробелами слева'кот'.rjust(6)
s.center(w)ставит по центру поля'ОТЧЁТ'.center(20)
s.zfill(w)дополняет нулями слева, бережёт знак'7'.zfill(4) → '0007'
s.ljust(w, ch)заполнитель вместо пробела'кот'.ljust(6, '.')
f'{s:<w}'то же в f-строкеf'{name:<10}'

Отдельно про center и нечётную ширину: лишний символ всегда уходит вправо. Если для вашей таблицы это неприемлемо и заголовок должен быть строго по центру, выравнивайте вручную через left = (width - len(s)) // 2 и дописывайте остаток справа. Разница в один пробел обычно не видна глазом, но при сравнении строк в тестах — видна.

И последнее, о чём стоит сказать прямо: выравнивание — это про отображение, а не про хранение. Не надо хранить в базе или в файле строки с выровненными пробелами: при чтении они превратятся в мусор, который придётся вычищать strip'ом. Выравнивайте в момент вывода — тогда данные остаются чистыми, а вид у них правильный.

Выравнивание в f-строках: тот же результат иначе

Методы ljust, rjust и center — это то, что в f-строках называется спецификациями выравнивания. Разница в синтаксисе, но не в сути: и там, и там вы задаёте общую ширину поля.

спецификации против методов
name = 'хлеб'
price = '45'
print(name.ljust(10) + price.rjust(6))
print(f'{name:<10}{price:>6}')
print(f'{name:<10}|{price:>6}|')
Вывод
хлеб          45
хлеб          45
хлеб      |    45|

Три строки дают одно и то же, и это не совпадение: f-строка внутри скобок выполняет тот же вызов метода. Выбор между синтаксисами — вопрос вкуса и контекста. Методы удобны, когда ширина лежит в переменной: s.ljust(width). Спецификации удобнее в f-строках, где всё уже собрано в один литерал и скобки подставляются вперемешку с текстом.

Про ведущие нули стоит знать ещё одно: спецификация 04d работает с ЧИСЛОМ и даёт 0007, а zfill — со СТРОКОЙ и тоже даёт 0007. Для целых чисел f-строка удобнее, для уже готовых строк (номер из базы, код из JSON) — zfill. Смешивать их не стоит: '0007' из базы и str(7).zfill(4) — это разные строки, хотя выглядят одинаково.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

print('ab'.center(5, '*'))
print('7'.zfill(3), '12'.zfill(3))
print('молоко'.ljust(8) + '89'.rjust(4))
Проверь себя
0 / 8

1. Что вернёт выражение len('кот'.ljust(5))?

2. Что выведет print('42'.zfill(5))?

3. Что произойдёт, если строка длиннее указанной ширины?

4. Строка 'итог' короче ширины. Что делает второй аргумент в 'итог'.center(20, '=')?

5. Какой метод хранит номер заказа '7' в виде '0007'?

6. Что вернёт len('кот'.ljust(5))?

7. Что произойдёт, если строка длиннее указанной ширины?

8. Как вывести таблицу, если ширина колонки заранее неизвестна?

Карточки терминов
Запомнено: 0 / 6
Практика

Дан список товаров: goods = [['хлеб', 45], ['молоко', 89], ['сыр', 540]]. Выведи прайс тремя строками: имя товара выровняй влево в поле шириной 10, цену — вправо в поле шириной 6, без пробела между колонками.

practice.py
Вопросы и ответы по уроку

Как добавить ведущие нули к числу в Python?

Для строки номера — методом zfill: '7'.zfill(4) даст '0007'. Для числа в f-строке — спецификацией f'{7:04d}': ведущие нули, минус при необходимости и общая ширина поля.

Обрежет ли ljust строку, если она длиннее ширины?

Нет: ни ljust, ни rjust, ни center, ни zfill не обрезают текст. Строка, которая уже длиннее или равна заданной ширине, возвращается без изменений.

Как выровнять текст в колонки в Python?

Методами ljust и rjust: левую колонку дотягивают до ширины через ljust, правую — через rjust, а потом склеивают. Ширина задаётся общей длиной результата, второй аргумент может заменить пробел любым символом. В f-строках то же самое записывается спецификацией: f'{name:<10}'.

Урок 16: выравнивание строк

Как добавить ведущие нули к числу в Python?

Для строки номера — методом zfill: '7'.zfill(4) даст '0007'. Для числа в f-строке — спецификацией f'{7:04d}': ведущие нули, минус при необходимости и общая ширина поля. Разница с rjust в том, что zfill бережёт знак: '-7'.zfill(5) даст '-0007'.

Почему zfill нельзя вызвать прямо у числа?

zfill — метод строки, а не числа: у числа 7 такого метода нет. Сначала преобразуйте число в строку через str(7).zfill(4) или используйте f-строку с форматом 04d.

Обрежет ли ljust строку, если она длиннее ширины?

Нет: ни ljust, ни rjust, ни center, ни zfill не обрезают текст. Строка, которая уже длиннее или равна заданной ширины, возвращается без изменений. Проверить это можно одним print — и не забыть, что колонки при этом «поедут».

Как вывести таблицу с ровными колонками, если ширины заранее не знаешь?

Посчитайте ширину по данным: width = max(len(name) for name, _ in rows), а потом выравнивайте каждое поле через ljust(width). Так таблица останется ровной при любых данных. Фиксированная ширина вроде 10 — хрупкий вариант: длинное значение съест разделитель, и ошибку заметят только глазами.

Понравился урок? Сошлитесь на него

«Ни ljust, ни rjust, ни center никогда не обрезают строку: если она уже длиннее заданной ширины, метод вернёт её без изменений.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.