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 )

284voto

jethro Points 4930

Essayer os.path.splitext il devrait faire ce que vous voulez.

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

os.path.splitext('/home/user/somefile.txt')  # returns ('/home/user/somefile', '.txt')

220voto

JS. Points 1964

En développant la réponse d'AnaPana, comment supprimer une extension à l'aide de 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

54voto

katrielalex Points 40655

Comme l'a dit @jethro, splitext est la meilleure façon de procéder. Mais dans ce cas, il est assez facile de le faire soi-même, puisque l'extension doit être la partie du nom de fichier qui suit le point final :

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

Les rsplit indique à Python d'effectuer les séparations de chaînes en commençant par la droite de la chaîne, et l'option 1 dit d'effectuer au plus un fractionnement (de sorte que, par exemple, l'option 'foo.bar.baz' -> [ 'foo.bar', 'baz' ] ). Puisque rsplit renverra toujours un tableau non vide, nous pouvons sans risque indexer 0 pour obtenir le nom du fichier sans l'extension.

19voto

IvanD Points 581

Je préfère l'approche suivante, qui consiste à utiliser [str.rsplit()](https://docs.python.org/2/library/stdtypes.html#str.rsplit%20%22str.rsplit()) :

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

Exemple :

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

15voto

Michael Hall Points 445

Gestion de plusieurs extensions

Dans le cas où vous avez plusieurs extensions utilisant pathlib y str.replace fonctionne très bien :

Enlever/découper les 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'

Remplacer les 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'

Si vous souhaitez également un pathlib alors vous pouvez évidemment envelopper la ligne dans l'objet Path()

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

Envelopper le tout dans une fonction

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

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