[Tutor] Another way to strip?

Steven D'Aprano steve at pearwood.info
Thu Jan 19 19:53:09 EST 2017

On Thu, Jan 19, 2017 at 04:29:16PM -0500, ad^2 wrote:
> Hello all,
> I'm looking for a cleaner more elegant way to achieve stripping out a file
> name from a list which contains a path and file extension.
> Ex.
> my_list = ['/var/tmp/02_80_5306_4444_2017_01_19_08-36-57_4918_0.zip',
> '/var/tmp/02_80_5309_4444_2017_01_19_08-40-30_4205_0.zip',
> '/var/tmp/02_80_5307_4444_2017_01_19_08-38-09_1763_0.zip']
> >>> for i in my_list:
> ...     i.strip('/var/tmp/.zip')

That doesn't do what you think it does! That strips off each individual 
character '/', 'v', 'a', 'r', ... 'i', 'p' from the front and back of 
the string. If the format of the name changes, this could be 

py> path = '/var/tmp/tz-19_08-40-30_4205-a.zip'
py> path.strip('/var/tmp/.zip')  # expecting tz-19_08-40-30_4205-a

What you want is the basename of the path, less the extension:

py> import os
py> path = '/var/tmp/02_80_5309_4444_2017_01_19_08-40-30_4205_0.zip'
py> os.path.basename(path)
py> os.path.splitext(os.path.basename(path))[0]

That's a bit unwieldy, so create a helper function:

import os
def base(path):
    return os.path.splitext(os.path.basename(path))[0]

Now you can safely use this on your list:

for path in my_list:

Or if you want a new list, you can use a list comprehension:

filenames = [base(path) for path in my_list]

or the map() function:

# Python 2
filenames = map(base, my_list)

# Python 3
filenames = list(map(base, my_list))


More information about the Tutor mailing list