How can I replace (or strip) an extension from a filename in Python?

ID : 20370

viewed : 47

Tags : pythonfilenamessconsstrippython

Top 5 Answer for How can I replace (or strip) an extension from a filename in Python?

vote vote

100

Try os.path.splitext it should do what you want.

import os print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg' 
vote vote

89

Expanding on AnaPana's answer, how to remove an extension using pathlib (Python >= 3.4):

>>> from pathlib import Path  >>> filename = Path('/some/path/somefile.txt')  >>> filename_wo_ext = filename.with_suffix('')  >>> filename_replace_ext = filename.with_suffix('.jpg')  >>> print(filename) /some/path/somefile.ext      >>> print(filename_wo_ext) /some/path/somefile  >>> print(filename_replace_ext) /some/path/somefile.jpg 
vote vote

74

As @jethro said, splitext is the neat way to do it. But in this case, it's pretty easy to split it yourself, since the extension must be the part of the filename coming after the final period:

filename = '/home/user/somefile.txt' print( filename.rsplit( ".", 1 )[ 0 ] ) # '/home/user/somefile' 

The rsplit tells Python to perform the string splits starting from the right of the string, and the 1 says to perform at most one split (so that e.g. 'foo.bar.baz' -> [ 'foo.bar', 'baz' ]). Since rsplit will always return a non-empty array, we may safely index 0 into it to get the filename minus the extension.

vote vote

64

I prefer the following one-liner approach using str.rsplit():

my_filename.rsplit('.', 1)[0] + '.jpg' 

Example:

>>> my_filename = '/home/user/somefile.txt' >>> my_filename.rsplit('.', 1) >>> ['/home/user/somefile', 'txt'] 
vote vote

59

Handling multiple extensions

In the case where you have multiple extensions using pathlib and str.replace works a treat:

Remove/strip extensions

>>> from pathlib import Path >>> p = Path("/path/to/myfile.tar.gz") >>> extensions = "".join(p.suffixes)  # any python version >>> str(p).replace(extensions, "") '/path/to/myfile'  # python>=3.9 >>> str(p).removesuffix(extensions) '/path/to/myfile' 

Replace extensions

>>> p = Path("/path/to/myfile.tar.gz") >>> extensions = "".join(p.suffixes) >>> new_ext = ".jpg" >>> str(p).replace(extensions, new_ext) '/path/to/myfile.jpg' 

If you also want a pathlib object output then you can obviously wrap the line in Path()

>>> Path(str(p).replace("".join(p.suffixes), "")) PosixPath('/path/to/myfile') 

Wrapping it all up in a function

from pathlib import Path from typing import Union  PathLike = Union[str, Path]   def replace_ext(path: PathLike, new_ext: str = "") -> Path:     extensions = "".join(Path(path).suffixes)     return Path(str(p).replace(extensions, new_ext))   p = Path("/path/to/myfile.tar.gz") new_ext = ".jpg"  assert replace_ext(p, new_ext) == Path('/path/to/myfile.jpg') assert replace_ext(str(p), new_ext) == Path('/path/to/myfile.jpg') assert replace_ext(p) == Path('/path/to/myfile')      

Top 3 video Explaining How can I replace (or strip) an extension from a filename in Python?

Related QUESTION?