238 votes

Comment remplacer (ou supprimer) une extension d'un nom de fichier en Python ?

Existe-t-il une fonction intégrée dans Python qui remplacerait (ou supprimerait, peu importe) l'extension d'un nom de fichier (s'il en a une) ?

Exemple :

print replace_extension('/home/user/somefile.txt', '.jpg')

Dans mon exemple : /home/user/somefile.txt deviendrait /home/user/somefile.jpg

Je ne sais pas si c'est important, mais j'en ai besoin pour un module SCons que je suis en train d'écrire. (Il y a donc peut-être une fonction spécifique à SCons que je peux utiliser ?)

J'aimerais quelque chose propre . En effectuant un simple remplacement de chaîne de caractères de toutes les occurrences de .txt à l'intérieur de la chaîne n'est évidemment pas propre. (Cela échouerait si mon nom de fichier était somefile.txt.txt.txt )

9voto

jisrael18 Points 331

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')

7voto

user2802945 Points 149

Une autre façon de procéder est d'utiliser la fonction str.rpartition(sep) méthode.

Par exemple :

filename = '/home/user/somefile.txt'
(prefix, sep, suffix) = filename.rpartition('.')

new_filename = prefix + '.jpg'

print new_filename

6voto

AnaPana Points 1220

Pour Python >= 3.4 :

from pathlib import Path

filename = '/home/user/somefile.txt'

p = Path(filename)
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg')
new_filename_str = str(new_filename) # '/home/user/somefile.jpg'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X