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
)
Essayez os.path.splitext il devrait faire ce que vous voulez.
import os
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'
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
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.
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']
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'
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
Dans le cas où vous avez plusieurs extensions, ce one-liner utilisant pathlib
et str.replace
Fonctionne:
>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> str(p).replace("".join(p.suffixes), "")
'/path/to/myfile'
>>> 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')