Existe-t-il une fonction intégrée en 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 cela compte, mais j'en ai besoin pour un module SCons que j'écris. (Alors peut-être y a-t-il une fonction spécifique à SCons que je peux utiliser?)
J'aimerais quelque chose de propre . Faire un simple remplacement de chaîne de toutes les occurrences de .txt
la chaîne n'est évidemment pas propre. (Cela échouerait si mon nom de fichier est somefile.txt.txt.txt
)
Réponses:
Essayez os.path.splitext, il devrait faire ce que vous voulez.
la source
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
retournera/home/user/somefile/.jpg
, ce qui n'est pas souhaitable.En développant la réponse d'AnaPana, comment supprimer une extension à l'aide de pathlib (Python> = 3.4):
la source
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
sortira'data/foo.tar.jpg'
. Je suppose que vous pouvez le fairepth.with_suffix('').with_suffix('.jpg')
, mais c'est maladroit, et vous auriez besoin d'ajouter une chaîne d'.with_suffix('')
appels arbitrairement longue afin de traiter un nombre arbitraire de points.
dans une extension de fichier (certes, plus de 2 est un cas de pointe exotique).while
boucle pour résoudre ce problème:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Comme l'a dit @jethro,
splitext
c'est la meilleure façon de le faire. Mais dans ce cas, il est assez facile de le diviser vous-même, puisque l'extension doit être la partie du nom de fichier venant après la dernière période:Le
rsplit
dit à Python d'effectuer le fractionnement de chaîne en commençant par la droite de la chaîne, et le1
dit d'effectuer au plus un fractionnement (de sorte que par exemple'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Puisquersplit
retournera toujours un tableau non vide, nous pouvons en toute sécurité l'indexer0
pour obtenir le nom de fichier moins l'extension.la source
rsplit
entraînera des résultats différents pour les fichiers commençant par un point et n'ayant pas d'autre extension (comme les fichiers cachés sous Linux, par exemple.bashrc
).os.path.splitext
renvoie une extension vide pour ceux-ci, mais l'utilisationrsplit
traitera le nom de fichier entier comme une extension./home/john.johnson/somefile
Je préfère l'approche à une ligne suivante en utilisant str.rsplit () :
Exemple:
la source
Pour Python> = 3.4:
la source
Gérer plusieurs extensions
Dans le cas où vous avez plusieurs extensions, ce one-liner utilise
pathlib
etstr.replace
fonctionne un régal:Supprimer / supprimer les extensions
Remplacer les extensions
Si vous voulez également une
pathlib
sortie d'objet, vous pouvez évidemment envelopper la ligne dansPath()
Tout emballer dans une fonction
la source
with_suffix
place dereplace
ne supprimerait qu'à la.gz
place de.tar.gz
Ma réponse était censée être "générale", mais si vous n'attendez qu'une seule extension, cewith_suffix
serait une solution plus propre.Une autre façon de faire est d'utiliser la
str.rpartition(sep)
méthode.Par exemple:
la source