TLDR : La meilleure façon de remplacer toutes les extensions, à mon avis, est la suivante.
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(p.with_name(p.name.split('.')[0]).with_suffix('.jpg'))
Réponse plus longue : La meilleure façon de procéder dépend de votre version de Python et du nombre d'extensions à gérer. Cela dit, je suis surpris que personne n'ait mentionné la fonction with_name
. Je suis également préoccupé par le fait que certaines réponses ne tiennent pas compte d'une .
dans les répertoires parents. Il existe plusieurs façons d'effectuer le remplacement des extensions.
Utilisation d'objets chemin
Remplacer jusqu'à une extension
import pathlib
p = pathlib.Path('/path/to.my/file.foo')
print(p.with_suffix('.jpg'))
Remplacer jusqu'à deux extensions
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar')
print(p.with_name(p.stem).with_suffix('.jpg'))
Remplacer toutes les extensions
Utilisation de pathlibs with_name
(meilleure solution, à mon avis) :
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(p.with_name(p.name.split('.')[0]).with_suffix('.jpg'))
Utilisation functools.reduce
et de pathlib with_suffix
:
import pathlib
import functools
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(functools.reduce(lambda v, _: v.with_suffix(''), p.suffixes, p).with_suffix('.jpg'))
print(functools.reduce(lambda v, e: v.with_suffix(e), ['' for _ in p.suffixes] + ['.jpg'], p))
Python 3.9+ Utilisation de pathlib et de str.removesuffix :
import pathlib
p = pathlib.Path('/path/to.my/file.foo.bar.baz.quz')
print(pathlib.Path(str(p).removesuffix(''.join(p.suffixes))).with_suffix('.jpg'))
Sans utiliser d'objets chemin (chaînes uniquement)
En général, je pense que les solutions utilisant pathlib sont plus propres, mais tout le monde ne peut pas le faire. Si vous utilisez encore python 2, je suis désolé. Si vous n'avez pas le paquet pathlib pour python 2, je suis vraiment désolé.
Remplacer toutes les extensions
Compatible avec Python 2.7 en utilisant os.path
:
import os
ps = '/path/to.my/file.foo.bar.baz.quz'
print(os.path.join(os.path.dirname(ps), os.path.basename(ps).split('.')[0] + '.jpg'))
Python 3.9+ Utilisation removesuffix
y os.path
(si vous avez python3.9, pourquoi n'utilisez-vous pas pathlib
?) :
import os
ps = '/path/to.my/file.foo.bar.baz.quz'
print(ps.removesuffix(os.path.splitext(ps)[-1].split('.', 1)[-1]) + 'jpg')