python: rstrip one exact string, respecting order

Is it possible to use the python command rstrip so that it does only remove one exact string and does not take all letters separately?

I was confused when this happened:

>>>"Boat.txt".rstrip(".txt")
>>>'Boa'

What I expected was:

>>>"Boat.txt".rstrip(".txt")
>>>'Boat'

Can I somehow use rstrip and respect the order, so that I get the second outcome?


You're using wrong method. Use str.replace instead:

>>> "Boat.txt".replace(".txt", "")
'Boat'

NOTE: str.replace will replace anywhere in the string.

>>> "Boat.txt.txt".replace(".txt", "")
'Boat'

To remove the last trailing .txt only, you can use regular expression:

>>> import re
>>> re.sub(r"\.txt$", "", "Boat.txt.txt")
'Boat.txt'

If you want filename without extension, os.path.splitext is more appropriate:

>>> os.path.splitext("Boat.txt")
('Boat', '.txt')

Starting with Python 3.9, use .removesuffix():

"Boat.txt".removesuffix(".txt")

On earlier versions of Python, you'll have to either define it yourself:

def removesuffix(s, suf):
    if suf and s.endswith(suf):
        return s[:-len(suf)]
    return s

(you need to check that suf isn't empty, otherwise removing an empty suffix e.g. removesuffix("boat", "") will do return s[:0] and return "" instead of "boat")

or use regex:

import re
suffix = ".txt"
s = re.sub(re.escape(suffix) + '$', '', s)