web-dev-qa-db-fra.com

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

Existe-t-il une fonction intégrée dans Python) qui remplacerait (ou supprimerait quoi que ce soit) l’extension d’un nom de fichier (le cas échéant)?

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 j'écris. (Alors peut-être que je peux utiliser une fonction spécifique de SCons?)

Je voudrais quelque chose propre. Faire une simple chaîne de remplacement de toutes les occurrences de .txt dans la chaîne n'est évidemment pas propre. (Cela échouerait si mon nom de fichier est somefile.txt.txt.txt)

81
ereOn

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

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

En développant la réponse de 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
47
JS.

Comme @jethro l'a dit, splitext est la meilleure façon de le faire. Mais dans ce cas, il est assez facile de le scinder vous-même, puisque l'extension doit être la partie du nom de fichier qui suit la dernière période:

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

rsplit indique à Python d'effectuer les divisions de chaîne à partir de la droite de la chaîne, et le 1 dit d'exécuter au plus une division (de sorte que, par exemple, 'foo.bar.baz' -> [ 'foo.bar', 'baz' ]). Puisque rsplit renverra toujours un tableau non vide, nous pouvons indexer en toute sécurité 0 dans le fichier pour obtenir le nom du fichier moins l’extension.

27
Katriel

Je préfère l'approche suivante à une ligne utilisant str.rsplit () :

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

Exemple:

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

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'
2
AnaPana

Une autre façon de faire consiste à utiliser la méthode str.rpartition(sep) .

Par exemple:

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

new_filename = prefix + '.jpg'

print new_filename
2
user2802945

Gestion de plusieurs extensions

Dans le cas où vous avez plusieurs extensions, ce one-liner utilisant pathlib et str.replace Fonctionne:

Retirer/décaper les extensions

>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> str(p).replace("".join(p.suffixes), "")
'/path/to/myfile'

Remplacer les extensions

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

Si vous voulez aussi un objet pathlib, alors vous pouvez évidemment envelopper la ligne dans Path()

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