Выравнивание строк: 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))
1. Что вернёт выражение len('кот'.ljust(5))?
2. Что выведет print('42'.zfill(5))?
3. Что произойдёт, если строка длиннее указанной ширины?
4. Строка 'итог' короче ширины. Что делает второй аргумент в 'итог'.center(20, '=')?
5. Какой метод хранит номер заказа '7' в виде '0007'?
6. Что вернёт len('кот'.ljust(5))?
7. Что произойдёт, если строка длиннее указанной ширины?
8. Как вывести таблицу, если ширина колонки заранее неизвестна?
Дан список товаров: goods = [['хлеб', 45], ['молоко', 89], ['сыр', 540]]. Выведи прайс тремя строками: имя товара выровняй влево в поле шириной 10, цену — вправо в поле шириной 6, без пробела между колонками.
Как добавить ведущие нули к числу в 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-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Строки · Урок 15
count: считаем вхождения в строке
count отвечает на вопрос «сколько?»: вхождений подстроки, символов в слове, слов в отзыве. Разбираем непересекающийся подсчёт, диапазон поиска и ловушку строки 'ааа'.
Строки · Урок 17
Многострочные строки и тексты
Тройные кавычки хранят текст с переводами строк: заказ из трёх строк, стихотворение, лог. Считаем длину многострочной строки, ловим отступы и режем текст методом splitlines.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
openpyxl · Урок 7
Ширина столбцов и высота строк в openpyxl
Длинные названия больше не обрезаются: column_dimensions задаёт ширины столбцов, row_dimensions — высоты строк, а автоширина считается циклом по самой длинной строке.
openpyxl ширина столбцаopenpyxl высота строки
Исключения · Урок 12
ValueError в Python: разбор строк в числа
int('восемнадцать') — тип подходящий, а значение не помещается. Разбираем сообщение invalid literal, границы int и float и честную проверку isdigit.
python int из строкиpython приведение типов строка число
Строки · Урок 4
Формат-спецификации f-строк: цена, ширина, выравнивание
F-строка умеет не только вставлять значение, но и оформлять его: два знака после точки у цены, ровные колонки, знак числа, нули вместо пробелов. Всё это — спецификация после двоеточия.
f строки форматированиеформатирование строк python