I actually wrote a solution for this on a recent project of mine. I've compressed the majority of it down to be a little smaller.
def smart_truncate(content, length=100, suffix='...'):
if len(content) <= length:
return content
else:
return ' '.join(content[:length+1].split(' ')[0:-1]) + suffix
What happens is the if-statement checks if your content is already less than the cutoff point. If it's not, it truncates to the desired length, splits on the space, removes the last element (so that you don't cut off a word), and then joins it back together (while tacking on the '...').
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…