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

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

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

split: разобрать строку

Одна строка данных редко живёт одна: CSV-запись, строка лога, поля формы. Метод split режет строку по разделителю и возвращает список частей — разбираем все варианты, от запятой до splitlines.

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

До сих пор мы работали со строкой как с целым. Но данные часто приходят пачкой в одной строке: CSV-запись «имя,город,сумма», строка лога через точку с запятой, время через двоеточия. Метод split разбивает строку на части по разделителю и возвращает их списком. Это обратная пара к методу join из урока 10: split собирает из строки список, join — из списка строку.

Сценарий: дата приходит строкой

Из внешней системы дата приходит строкой «2026-03-14», и её надо превратить в отдельные год, месяц и день. Строка не содержит этих значений — она их кодирует разделителем. Split как раз и есть операция «возьми текст между разделителями», и для дат, кодов и CSV-записей она подходит идеально.

дата разбирается на три части
d = '2026-03-14'
parts = d.split('-')
print(parts)
print(len(parts))
print(parts[0])
Вывод
['2026', '03', '14']
3
2026

Три части — значит, три элемента списка, а нумерация элементов, как и у строк, с нуля. Первая часть — год. Распаковать прямо в переменные можно, если их ровно столько же, сколько частей: year, month, day = d.split('-').

split по разделителю

Схема: s.split(разделитель) — режь строку в каждом месте, где встретился разделитель, и отдай куски списком. Разложим CSV-строку:

CSV-строка превращается в список
order = 'имя,город,сумма'
parts = order.split(',')
print(parts)
print(type(parts))
Вывод
['имя', 'город', 'сумма']
<class 'list'>

Результат — не строка, а список (тип list): упорядоченная коллекция значений. С элементами списка работают уже знакомые по срезам урока 2 индексы — первый элемент под номером ноль:

элементы списка по индексам
parts = 'Аня,Пермь,1250'.split(',')
print(parts[0])
print(parts[2])
print(len(parts))
Вывод
Аня
1250
3

Разделитель может быть длиннее одного символа — split режет по всей его длине. Точка с запятой в экспортных файлах, двоеточия во времени:

разные разделители
log = '2026-03-14;админ;вход'
print(log.split(';'))
print('14:30:00'.split(':'))
Вывод
['2026-03-14', 'админ', 'вход']
['14', '30', '00']

split без аргумента: любые пробелы

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

грязный отзыв распался на слова
review = '  Доставка   быстрая,   но   коробка помята  '
print(review.split())
Вывод
['Доставка', 'быстрая,', 'но', 'коробка', 'помята']

Края строки очистились сами, двойные пробелы не оставили пустых кусков — это самый безопасный способ посчитать слова: len(review.split()). Сравните с явным разделителем-пробелом:

split(' ') против split()
line = 'а  б'
print(line.split(' '))
print(line.split())
Вывод
['а', '', 'б']
['а', 'б']
пустой разделитель не работает
try:
    print('кот'.split(''))
except ValueError as e:
    print('Ошибка:', e)
Вывод
Ошибка: empty separator

Чего split не умеет

Split режет по символам и ничего не знает про кавычки и запятые внутри кавычек. Для CSV, где название компании может содержать запятую, это становится настоящей проблемой: строка развалится не там, где надо.

запятая внутри кавычек
line = 'ООО "Ромашка", 2026'
print(line.split(','))
Вывод
['ООО "Ромашка"', ' 2026']

Здесь повезло: запятая оказалась внутри кавычек, но не внутри названия. Стоит появиться «Ромашка, ООО» — и получится три части вместо двух. Для настоящего CSV есть отдельный модуль csv с методом csv.reader, который понимает кавычки, экранирование и переводы строк. Он медленнее наивного split, но даёт правильный результат.

maxsplit: ограничить число разрезов

Второй аргумент — maxsplit — разрешает не больше указанного числа разрезов. Спасает, когда разделитель встречается внутри данных, как запятая в адресе:

адрес с запятыми устоял
line = 'Пётр, Петров, Москва, ул. Ленина, 5'
print(line.split(',', 2))
print(line.split(',', 1))
Вывод
['Пётр', ' Петров', ' Москва, ул. Ленина, 5']
['Пётр', ' Петров, Москва, ул. Ленина, 5']

С лимитом 2 строка разрезалась дважды, а весь хвост — адрес с его запятыми — остался одним куском. Обратите внимание: пробел после запятой остался в начале куска; убрать его можно strip из урока 6 или, для всей пачки, аккуратнее задать данные.

splitlines: разбор по строкам

Для многострочного текста есть отдельный метод — splitlines(): он делит текст по переводам строк и возвращает список строк:

многострочный отчёт в список
report = 'Первая строка\nВторая строка\nТретья'
print(report.splitlines())
print(report.split('\n'))
Вывод
['Первая строка', 'Вторая строка', 'Третья']
['Первая строка', 'Вторая строка', 'Третья']

Здесь оба способа дали одинаковый список. Разница проявляется, когда текст заканчивается переводом строки: splitlines не создаёт пустого хвоста, а split('\n') — создаёт:

хвостовой перенос строки
multiline = 'а\nб\n'
print(multiline.splitlines())
print(multiline.split('\n'))
Вывод
['а', 'б']
['а', 'б', '']

Разбор заказа: CSV в три переменные

Соберём приём целиком. CSV-строка заказа режется на части, и части удобно сразу разложить в отдельные переменные — Python распакует список, если переменных ровно столько, сколько частей:

распаковка CSV-строки
csv_line = 'Анна,Казань,2450.50'
name, city, total = csv_line.split(',')
print(name, '-', city, '-', total)
Вывод
Анна - Казань - 2450.50

Три части — три переменные, и каждая получила своё поле. Но случись в данных лишняя запятая, частей станет четыре, и распаковка честно упадёт:

лишнее поле ломает распаковку
csv_line = 'Анна,Казань,2450.50,доставка'
try:
    name, city, total = csv_line.split(',')
except ValueError as e:
    print('Ошибка:', e)
Вывод
Ошибка: too many values to unpack (expected 3)

Ещё один штрих: сумма пришла строкой — '2450.50'. Считать с ней можно только после превращения в число, например float(total). Иначе плюс сложит тексты: '2450.50' + '100' даст '2450.50100' — помните урок 1 про конкатенацию.

Split и числа

Разобрав строку, получают части — а части остаются строками. Дальше с ними почти всегда нужно считать, и вот тут возникает типовая ошибка: отсортировать цены, сложенные как текст, получится неправильно, потому что «1000» и «250» сравнятся как символы, а не как числа.

текст сначала, числа потом
prices = ['1250.50', '980', '2400']
nums = [float(p) for p in prices]
print(min(nums))
print(max(nums))
Вывод
980.0
2400.0

Сначала каждая часть превращается в число, потом список чисел сравнивается как числа. Порядок операций тут принципиален: если сортировать строки, девятьсот окажутся больше двухтысячных, потому что «9» больше «2».

Карточка разборов строки

ВызовЧто делаетПример результата
s.split(',')режет по каждой запятой'а,б'.split(',') — ['а', 'б']
s.split()режет по любым пробелам, пустые выбрасывает'а б'.split() — ['а', 'б']
s.split(',', 2)не больше двух разрезовхвост остаётся одним куском
s.splitlines()режет по переводам строкбез пустого хвоста
len(s.split())число слов в текстессылка на count

Обратную операцию — склеить список обратно в строку с любым разделителем — делает join. Ему и посвящён урок 10.

Мини-практика: заказы из списка строк

Три заказа пришли одной строкой каждый: код, товар, количество. Разберите их по запятой, переведите количество в число и выведите по строке на заказ в формате «код: количество шт.».

разбор трёх заказов
orders = ['ORD-1,чай,2', 'ORD-2,кофе,1', 'ORD-3,сыр,3']
for order in orders:
    code, item, qty = order.split(',')
    print(f'{code}: {int(qty)} шт.')
Вывод
ORD-1: 2 шт.
ORD-2: 1 шт.
ORD-3: 3 шт.

Здесь встретились сразу три приёма: split разбирает строку на части, распаковка раскладывает их в три переменные, а int превращает количество из текста в число. Количество здесь выводится, но в реальной задаче с ним сразу считают — и если бы строки сортировали как текст, порядок был бы неверным.

Как разделить строку в Python: split

split — обратная операция к join: берёт строку и режет её на список по разделителю. Разделитель можно задать явно, а можно не задавать — тогда Python режет по любой последовательности пробельных символов и отбрасывает пустые куски. Разница между этими двумя режимами — источник половины багов при разборе CSV и логов.

split с разделителем и без него
raw = '  чай  80  кофе  150  '
parts = raw.split()
print(parts)
print(len(parts))
Вывод
['чай', '80', 'кофе', '150']
4

Без разделителя split режет по пробелам и их комбинациям, а пустые куски выбрасывает. Именно выбрасывает: ' чай 80 '.split() даст три слова, а не пять с пустыми. Это удобно для текста и опасно для структурированных данных — в CSV пустое поле между двумя запятыми это значение, а не мусор.

maxsplit: разрезать не всё

Второй аргумент split ограничивает количество разрезов. Это то, что нужно, когда разделитель встречается внутри значения: в дате 2026-03-14 дефис встречается дважды, а разумно разрубить строку только один раз.

maxsplit и разделитель, встречающийся дважды
line = 'name=anna;city=kazan;age=30'
print(line.split(';'))
print(line.split(';', 1))
print(line.split('='))
Вывод
['name=anna', 'city=kazan', 'age=30']
['name=anna', 'city=kazan;age=30']
['name', 'anna;city', 'kazan;age', '30']

Третий вывод показывает, почему split без указания разделителя опасен для структурированных данных: = встречается трижды, и куски получились не те, что ожидались. Правило простое: если в данных есть разделитель, всегда указывайте его явно. split() без аргументов — только для свободного текста.

splitlines: многострочный текст по строкам

Отдельный метод — splitlines(). Он режет текст по переводам строк и не создаёт пустых элементов в конце, где файл обычно заканчивается переводом строки. Разница с split('\n') видна на файлах Windows: там перевод строки — это два символа, \r\n, и обычный split('\n') оставит в кусках висящий \r.

splitlines на логе
log = '''2026-03-14 INFO старт
2026-03-14 ERROR диск
2026-03-14 INFO стоп'''
rows = log.splitlines()
print(len(rows))
print(rows[1])
print(rows[1].split(' ', 2))
Вывод
3
2026-03-14 ERROR диск
['2026-03-14', 'ERROR', 'диск']

Третья строка — комбинация, которой пользуются постоянно: сначала режем лог на строки, потом строку на поля. Обратите внимание на split(' ', 2) — максимум два разреза, чтобы в поле «сообщение» попал весь остаток строки вместе с пробелами. Без ограничения сообщение развалилось бы на слова.

ВызовЧто делаетКогда брать
s.split()режет по пробелам, пустые куски выбрасываетсвободный текст, логи, ввод
s.split(';')режет по разделителю, пустые куски ОСТАЮТСЯCSV, структурированные данные
s.split(';', 1)один разрез, дальше разделитель не трогаемзначение содержит разделитель
s.splitlines()режет по переводам строкмногострочный текст, чтение файла
s.rsplit(';', 1)разрез справапоследнее поле содержит разделитель
s.split('=')явный разделительпары ключ=значение

rsplit стоит знать рядом с split: он режет справа налево и полезен, когда разделитель может быть внутри последнего поля. Классика — разбор пути файла или лога: путь разрубают rsplit('/', 1), чтобы отделить имя файла от каталога, а не наоборот.

путь: убираем пустые части
path = '/home/anna/report.txt'
print(path.split('/'))
print([p for p in path.split('/') if p])
Вывод
['', 'home', 'anna', 'report.txt']
['home', 'anna', 'report.txt']

Первая строка показывает особенность split с разделителем: пустые куски остаются, и ведущий слэш даёт пустой элемент в начале. Отфильтровать их — работа [p for p in parts if p]. Симметричная операция — os.path.split, но раздел про строки, а не про файловую систему; в реальном коде для путей я бы всё-таки взял pathlib.

И последнее. split возвращает список — изменяемый. Попытка сделать s.split(',').sort() ничего не даст: метод sort у списка не возвращает новый список, а меняет его на месте и возвращает None. Правильно — sorted(s.split(',')). Мелочь, но на неё спотыкаются даже те, кто знает методы строк наизусть.

split режет строку по разделителю и возвращает список частей; без аргумента он делит текст на слова по пробелам, а splitlines — на строки по переносам.

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

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

print('14:30:00'.split(':'))
line = 'б  в'
print(line.split(' '))
print(line.split())
order = 'имя,город,сумма'
parts = order.split(',')
print(parts[1], len(parts))
Проверь себя
0 / 8

1. Что вернёт 'а,б,в'.split(',')?

2. Чем split() без аргумента отличается от split(' ')?

3. Что вернёт 'Пётр, Москва, ул. Ленина, 5'.split(',', 2)?

4. Текст 'а\nб\n' заканчивается переносом строки. Что вернёт .splitlines()?

5. В строке 'Анна,Казань,2450.50' сумма пришла текстом. Как её посчитать в числе?

6. name, city, total = 'Анна,Казань,2450.50,бонус'.split(',') — что произойдёт?

7. Что произойдёт при вызове 'кот'.split('')?

8. Почему для CSV с кавычками лучше модуль csv, а не split?

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

Переменная row = 'хлеб,молоко,сыр,кофе' уже задана. Разбей её по запятым и выведи три строки: первый товар, последний товар и количество товаров.

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

Как разбить строку по запятой в Python?

Методом split с разделителем в кавычках: 'а,б,в'.split(',') вернёт список ['а', 'б', 'в']. Если внутри данных тоже есть запятые, ограничьте число разрезов вторым аргументом: line.split(',', 2).

Урок 10: join

Как посчитать количество слов в строке?

Связкой len(s.split()): split без аргумента делит текст по любым пробелам и выбрасывает пустые куски, а len считает длину списка. Двойные пробелы и пробелы по краям результат не искажают.

Урок 15: count

Почему split(' ') оставляет пустые строки в списке?

Явный разделитель-пробел применяется буквально: между двумя подряд идущими пробелами находится пустой кусок, и он попадает в результат как ''. Чтобы пустот не было, вызывайте split() без аргумента — он схлопывает пробельные серии.

Чем splitlines лучше split('\n')?

Для обычного многострочного текста они равны, но при хвостовом переносе 'а\nб\n' метод splitlines вернёт две строки, а split('\n') — три, с пустой строкой в конце. splitlines также понимает редкие виды переносов, например \r\n из файлов Windows.

Урок 13: экранирование

Как разобрать дату «2026-03-14» на год, месяц и день?

Разделить по дефису и распаковать: year, month, day = '2026-03-14'.split('-'). Важно помнить, что части останутся строками — если с ними нужно считать, превращайте в int или float.

Урок 12: format() и старый процент

Можно ли разбить строку на пустой разделитель?

Нет: split('') бросает ValueError: empty separator. Разрезать строку на пустом месте бессмысленно, и Python сообщает об этом сразу, а не в середине цикла.

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

«До сих пор мы работали со строкой как с целым.»

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

TelegramVK

Что дальше

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

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

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