Есть несколько тонкостей, которые могут или не могут быть проблемой для вас, например, обработка вкладок (например, если вы отображаете их как 8 пробелов, но рассматриваете их как 1 символ внутри), обрабатывает различные варианты разбивания и неразрывный пробел, или разрешение разбивать на переносы и т. д. Если что-то из этого желательно, вы можете взглянуть на модуль textwrap. например:
def truncate(text, max_size):
if len(text) <= max_size:
return text
return textwrap.wrap(text, max_size-3)[0] + "..."
Поведение по умолчанию для слов, превышающих max_size, состоит в их нарушении (делая max_size жестким ограничением). Вы можете перейти к мягкому пределу, используемому некоторыми другими решениями здесь, передавая break_long_words = False в wrap (), и в этом случае он вернет все слово. Если вы хотите, чтобы это поведение изменило последнюю строку на:
lines = textwrap.wrap(text, max_size-3, break_long_words=False)
return lines[0] + ("..." if len(lines)>1 else "")
Есть несколько других опций, таких как expand_tabs, которые могут представлять интерес в зависимости от того, какое именно поведение вы хотите.