split, partition и запятая внутри значения
Почему split(":") рассыпается на первом же двоеточии в тексте.
Проблема
stroka = "ERROR: база: нет ответа"
uroven, tekst = stroka.split(":") # ValueError: слишком много частей
Разделитель встретился дважды, и распаковка в две переменные упала.
Три решения
Ограничить число делений:
uroven, tekst = stroka.split(":", 1) # ['ERROR', ' база: нет ответа']
partition — делит по первому вхождению и всегда даёт три части:
uroven, razdelitel, tekst = stroka.partition(":")
Средняя часть пуста, если разделителя не нашлось. По ней и проверяют — это надёжнее, чем считать длину списка.
klyuch, est, znachenie = stroka.partition("=")
if not est:
return "нет знака равенства"
rpartition — то же самое, но от конца. Нужен, когда разделитель последний: расширение файла, домен в адресе.
Почему это важнее, чем кажется
Значения со знаком равенства внутри — обычное дело: адреса
http://a.ru/?x=1, формулы, пароли. Разбор через split("=") их
порежет, и ошибка проявится не на тестовых данных, а на настоящих.
Для CSV — не то и не другое
Ни split, ни partition не годятся для разбора CSV: там значения
бывают в кавычках, а внутри кавычек — запятые и переводы строк.
Для этого есть модуль csv, и писать разбор руками не нужно.