Existe-t-il une fonction pour extraire l'extension d'un nom de fichier?
1303
Existe-t-il une fonction pour extraire l'extension d'un nom de fichier?
Oui. Utilisation os.path.splitext
(voir la documentation Python 2.X ou la documentation Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
Contrairement à la plupart des tentatives de fractionnement de chaînes manuelles, os.path.splitext
traitera correctement /a/b.c/d
comme n'ayant pas d'extension au lieu d'avoir une extension .c/d
, et il traitera .bashrc
comme n'ayant pas d'extension au lieu d'avoir une extension .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
est un peu déroutante ici caros.path.basename("/path/to/somefile.ext")
reviendrait"somefile.ext"
endswith()
plus portable et pythonique?.asd
c'est vraiment l'extension !! Si vous y réfléchissez,foo.tar.gz
c'est un fichier compressé avec gzip (.gz
) qui se trouve être un fichier tar (.tar
). Mais c'est un fichier gzip en premier lieu. Je ne m'attendrais pas du tout à ce qu'il retourne la double extension.splittext
. S'ils faisaient juste quelque chose pour signifier la rupture entre les parties de ce nom, il serait beaucoup plus facile de reconnaître que c'estsplitExt
ousplit_ext
. Je ne peux sûrement pas être la seule personne à avoir fait cette erreur?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. N'hésitez pas à fournir un exemple de compteur réel sans référencer une bibliothèque tierce.la source
import os.path
au lieu defrom os import path
?from os import path
alors le nompath
est repris dans votre portée locale, aussi les autres personnes qui regardent le code peuvent ne pas savoir immédiatement que path est le chemin du module os. Où comme si vous l'utilisiezimport os.path
le garde dans l'os
espace de noms et où que vous fassiez l'appel, les gens le savent immédiatementpath()
depuis leos
module._, extension = os.path.splitext(filename)
est beaucoup plus jolie.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Nouveau dans la version 3.4.
Je suis surpris que personne ne l'ait
pathlib
encore mentionné , c'estpathlib
génial!Si vous avez besoin de tous les suffixes (par exemple, si vous en avez un
.tar.gz
), vous.suffixes
en retournerez une liste!la source
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
pour vous assurer d'obtenir uniquement .tar.gz au maximum.Pour obtenir uniquement le texte de l'extension, sans le point.
la source
Une option peut être la séparation du point:
Aucune erreur lorsque le fichier n'a pas d'extension:
Mais vous devez faire attention:
la source
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
avec'file.tar.gz'.split('.')
vs['file.tar', 'gz']
avec'file.tar.gz'.rsplit('.', 1)
. oui, ça pourrait l'être.cela vaut la peine d'ajouter un plus bas pour que vous ne vous demandiez pas pourquoi les JPG n'apparaissent pas dans votre liste.
la source
N'importe laquelle des solutions ci-dessus fonctionne, mais sur Linux, j'ai trouvé qu'il y a une nouvelle ligne à la fin de la chaîne d'extension qui empêchera les correspondances de réussir. Ajoutez la
strip()
méthode à la fin. Par exemple:la source
[1:]
à.splittext(filename)[1][1:]
-d. l'entrée) - merci d'avancesplittext()
Je l'ai compris moi-même: (contrairement à si vous divisez une chaîne en utilisant '.') Inclut le '.' caractère dans l'extension. L'additionnel[1:]
s'en débarrasse.Avec splitext il y a des problèmes avec les fichiers à double extension (par exemple
file.tar.gz
,file.tar.bz2
, etc ..)mais devrait être:
.tar.gz
Les solutions possibles sont ici
la source
gunzip somefile.tar.gz
quel est le nom du fichier de sortie?Vous pouvez trouver de bonnes choses dans le module pathlib (disponible en python 3.x).
la source
Bien qu'il s'agisse d'un sujet ancien, mais je me demande pourquoi il n'y a aucun mention d'une API très simple de python appelée rpartition dans ce cas:
pour obtenir l'extension d'un chemin absolu de fichier donné, vous pouvez simplement taper:
exemple:
vous donnera: 'csv'
la source
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. S'il n'y a pas de séparateur trouvé, le tuple retourné sera:("", "", "the original string")
.Juste
join
touspathlib suffixes
.la source
Surpris, cela n'a pas encore été mentionné:
Avantages:
Comme fonction:
la source
[-1]
ensuite.Vous pouvez utiliser un
split
surfilename
:Cela ne nécessite pas de bibliothèque supplémentaire
la source
la source
filename
être retourné si le nom de fichier n'en a pas.
du tout. En effet,rfind
renvoie-1
si la chaîne n'est pas trouvée.Il s'agit d'une technique de représentation directe des chaînes: je vois beaucoup de solutions mentionnées, mais je pense que la plupart envisagent le split. Split le fait cependant à chaque occurrence de "." . Ce que vous préférez, c'est la partition.
la source
Une autre solution avec split droit:
la source
Même cette question est déjà répondue, j'ajouterais la solution dans Regex.
la source
\.[0-9a-z]+$
comme dans ce post .Un vrai one-liner, si vous aimez les regex. Et cela n'a pas d'importance même si vous avez des "." Supplémentaires. au milieu
Voir ici pour le résultat: Cliquez ici
la source
Il s'agit de la méthode la plus simple pour obtenir à la fois le nom de fichier et l'extension en une seule ligne .
Contrairement à d'autres solutions, vous n'avez pas besoin d'importer de package pour cela.
la source
Pour les drôles ... il suffit de rassembler les extensions dans un dict et de les suivre toutes dans un dossier. Tirez ensuite les extensions que vous souhaitez.
la source
essaye ça:
la source
foo.tar
est un nom de fichier valide. Que se passe-t-il si je jette ça sur votre code? Et pour.bashrc
oufoo
? Il y a une fonction de bibliothèque pour cela pour une raison ...la source
la source
Cela vous donnera le nom du fichier jusqu'au premier ".", Qui serait le plus courant.
la source
file.name.ext