Python truncate a long string

Python

Python Problem Overview


How does one truncate a string to 75 characters in Python?

This is how it is done in JavaScript:

var data="saddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsaddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
var info = (data.length > 75) ? data.substring[0,75] + '..' : data;

Python Solutions


Solution 1 - Python

info = (data[:75] + '..') if len(data) > 75 else data

Solution 2 - Python

Even more concise:

data = data[:75]

If it is less than 75 characters there will be no change.

Solution 3 - Python

Even shorter :

info = data[:75] + (data[75:] and '..')

Solution 4 - Python

If you are using Python 3.4+, you can use textwrap.shorten from the standard library:

> Collapse and truncate the given text to fit in the given width. > > First the whitespace in text is collapsed (all whitespace is replaced > by single spaces). If the result fits in the width, it is returned. > Otherwise, enough words are dropped from the end so that the remaining > words plus the placeholder fit within width: > > >>> textwrap.shorten("Hello world!", width=12) > 'Hello world!' > >>> textwrap.shorten("Hello world!", width=11) > 'Hello [...]' > >>> textwrap.shorten("Hello world", width=10, placeholder="...") > 'Hello...'

Solution 5 - Python

For a Django solution (which has not been mentioned in the question):

from django.utils.text import Truncator
value = Truncator(value).chars(75)

Have a look at Truncator's source code to appreciate the problem: https://github.com/django/django/blob/master/django/utils/text.py#L66

Concerning truncation with Django: https://stackoverflow.com/questions/8553786/django-html-truncation

Solution 6 - Python

With regex:

re.sub(r'^(.{75}).*$', '\g<1>...', data)

Long strings are truncated:

>>> data="11111111112222222222333333333344444444445555555555666666666677777777778888888888"
>>> re.sub(r'^(.{75}).*$', '\g<1>...', data)
'111111111122222222223333333333444444444455555555556666666666777777777788888...'

Shorter strings never get truncated:

>>> data="11111111112222222222333333"
>>> re.sub(r'^(.{75}).*$', '\g<1>...', data)
'11111111112222222222333333'

This way, you can also "cut" the middle part of the string, which is nicer in some cases:

re.sub(r'^(.{5}).*(.{5})$', '\g<1>...\g<2>', data)

>>> data="11111111112222222222333333333344444444445555555555666666666677777777778888888888"
>>> re.sub(r'^(.{5}).*(.{5})$', '\g<1>...\g<2>', data)
'11111...88888'

Solution 7 - Python

limit = 75
info = data[:limit] + '..' * (len(data) > limit)

Solution 8 - Python

This just in:

n = 8
s = '123'
print  s[:n-3] + (s[n-3:], '...')[len(s) > n]
s = '12345678'
print  s[:n-3] + (s[n-3:], '...')[len(s) > n]
s = '123456789'     
print  s[:n-3] + (s[n-3:], '...')[len(s) > n]
s = '123456789012345'
print  s[:n-3] + (s[n-3:], '...')[len(s) > n]

123
12345678
12345...
12345...

Solution 9 - Python

info = data[:min(len(data), 75)

Solution 10 - Python

This method doesn't use any if:

data[:75] + bool(data[75:]) * '..'

Solution 11 - Python

You can't actually "truncate" a Python string like you can do a dynamically allocated C string. Strings in Python are immutable. What you can do is slice a string as described in other answers, yielding a new string containing only the characters defined by the slice offsets and step. In some (non-practical) cases this can be a little annoying, such as when you choose Python as your interview language and the interviewer asks you to remove duplicate characters from a string in-place. Doh.

Solution 12 - Python

info = data[:75] + ('..' if len(data) > 75 else '')

Solution 13 - Python

Yet another solution. With True and False you get a little feedback about the test at the end.

data = {True: data[:75] + '..', False: data}[len(data) > 75]

Solution 14 - Python

       >>> info = lambda data: len(data)>10 and data[:10]+'...' or data
       >>> info('sdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdf')
           'sdfsdfsdfs...'
       >>> info('sdfsdf')
           'sdfsdf'
       >>> 

Solution 15 - Python

Simple and short helper function:

def truncate_string(value, max_length=255, suffix='...'):
    string_value = str(value)
    string_truncated = string_value[:min(len(string_value), (max_length - len(suffix)))]
    suffix = (suffix if len(string_value) > max_length else '')
    return string_truncated+suffix

Usage examples:

# Example 1 (default):

long_string = ""
for number in range(1, 1000): 
    long_string += str(number) + ','    

result = truncate_string(long_string)
print(result)


# Example 2 (custom length):

short_string = 'Hello world'
result = truncate_string(short_string, 8)
print(result) # > Hello... 


# Example 3 (not truncated):

short_string = 'Hello world'
result = truncate_string(short_string)
print(result) # > Hello world

Solution 16 - Python

Coming very late to the party I want to add my solution to trim text at character level that also handles whitespaces properly.

def trim_string(s: str, limit: int, ellipsis='…') -> str:
    s = s.strip()
    if len(s) > limit:
        return s[:limit].strip() + ellipsis
    return s

Simple, but it will make sure you that hello world with limit=6 will not result in an ugly hello … but hello… instead.

It also removes leading and trailing whitespaces, but not spaces inside. If you also want to remove spaces inside, checkout this stackoverflow post

Solution 17 - Python

There's no need for a regular expression but you do want to use string formatting rather than the string concatenation in the accepted answer.

This is probably the most canonical, Pythonic way to truncate the string data at 75 characters.

>>> data = "saddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsaddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
>>> info = "{}..".format(data[:75]) if len(data) > 75 else data
>>> info
'111111111122222222223333333333444444444455555555556666666666777777777788888...'

Solution 18 - Python

Here's a function I made as part of a new String class... It allows adding a suffix ( if the string is size after trimming and adding it is long enough - although you don't need to force the absolute size )

I was in the process of changing a few things around so there are some useless logic costs ( if _truncate ... for instance ) where it is no longer necessary and there is a return at the top...

But, it is still a good function for truncating data...

##
## Truncate characters of a string after _len'nth char, if necessary... If _len is less than 0, don't truncate anything... Note: If you attach a suffix, and you enable absolute max length then the suffix length is subtracted from max length... Note: If the suffix length is longer than the output then no suffix is used...
##
## Usage: Where _text = 'Testing', _width = 4
##		_data = String.Truncate( _text, _width )						== Test
##		_data = String.Truncate( _text, _width, '..', True )			== Te..
##
## Equivalent Alternates: Where _text = 'Testing', _width = 4
##		_data = String.SubStr( _text, 0, _width )						== Test
##		_data = _text[  : _width ]										== Test
## 		_data = ( _text )[  : _width ]									== Test
##
def Truncate( _text, _max_len = -1, _suffix = False, _absolute_max_len = True ):
	## Length of the string we are considering for truncation
	_len			= len( _text )

	## Whether or not we have to truncate
	_truncate		= ( False, True )[ _len > _max_len ]

	## Note: If we don't need to truncate, there's no point in proceeding...
	if ( not _truncate ):
		return _text

	## The suffix in string form
	_suffix_str		= ( '',  str( _suffix ) )[ _truncate and _suffix != False ]

	## The suffix length
	_len_suffix		= len( _suffix_str )

	## Whether or not we add the suffix
	_add_suffix		= ( False, True )[ _truncate and _suffix != False and _max_len > _len_suffix ]

	## Suffix Offset
	_suffix_offset = _max_len - _len_suffix
	_suffix_offset	= ( _max_len, _suffix_offset )[ _add_suffix and _absolute_max_len != False and _suffix_offset > 0 ]

	## The truncate point.... If not necessary, then length of string.. If necessary then the max length with or without subtracting the suffix length... Note: It may be easier ( less logic cost ) to simply add the suffix to the calculated point, then truncate - if point is negative then the suffix will be destroyed anyway.
	## If we don't need to truncate, then the length is the length of the string.. If we do need to truncate, then the length depends on whether we add the suffix and offset the length of the suffix or not...
	_len_truncate	= ( _len, _max_len )[ _truncate ]
	_len_truncate	= ( _len_truncate, _max_len )[ _len_truncate <= _max_len ]

	## If we add the suffix, add it... Suffix won't be added if the suffix is the same length as the text being output...
	if ( _add_suffix ):
		_text = _text[ 0 : _suffix_offset ] + _suffix_str + _text[ _suffix_offset: ]

	## Return the text after truncating...
	return _text[ : _len_truncate ]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHulkView Question on Stackoverflow
Solution 1 - PythonMarcelo CantosView Answer on Stackoverflow
Solution 2 - PythonneilView Answer on Stackoverflow
Solution 3 - PythonstanlekubView Answer on Stackoverflow
Solution 4 - PythonBora M. AlperView Answer on Stackoverflow
Solution 5 - PythonRisadinhaView Answer on Stackoverflow
Solution 6 - PythonDavide GuerriView Answer on Stackoverflow
Solution 7 - PythonHelloGoodbyeView Answer on Stackoverflow
Solution 8 - PythondansalmoView Answer on Stackoverflow
Solution 9 - PythonJesseView Answer on Stackoverflow
Solution 10 - PythonSassanView Answer on Stackoverflow
Solution 11 - PythonDaveView Answer on Stackoverflow
Solution 12 - PythonHelloGoodbyeView Answer on Stackoverflow
Solution 13 - PythonThe Veritable BugeaterView Answer on Stackoverflow
Solution 14 - PythonSpoukView Answer on Stackoverflow
Solution 15 - PythonlacroixDjView Answer on Stackoverflow
Solution 16 - PythonNicoHoodView Answer on Stackoverflow
Solution 17 - PythonAdam NelsonView Answer on Stackoverflow
Solution 18 - PythonAcecoolView Answer on Stackoverflow