Existe-t-il une fonction permettant d'extraire l'extension d'un nom de fichier?
Oui. Utilisez os.path.splitext
(voir documentation Python 2.X ou 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 manuel de chaînes, os.path.splitext
traitera correctement /a/b.c/d
comme n'ayant pas d'extension au lieu d'avoir l'extension .c/d
, et il traitera .bashrc
comme n'ayant pas d'extension ayant l'extension .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
import os.path
extension = os.path.splitext(filename)[1]
Nouveauté de la version 3.4.
import pathlib
print(pathlib.Path('yourPathGoesHere').suffix)
Je suis surpris que personne n'ait mentionné pathlib
encore, pathlib
IS génial!
Si vous avez besoin de tous les suffixes (par exemple, si vous avez un .tar.gz
), .suffixes
en retournera une liste!
import os.path
extension = os.path.splitext(filename)[1][1:]
Pour obtenir uniquement le texte de l'extension, sans le point.
Une option peut être scinder du point:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Pas d'erreur quand le fichier n'a pas d'extension:
>>> "filename".split(".")[-1]
'filename'
Mais vous devez faire attention:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
cela vaut la peine d’ajouter un plus bas pour ne pas vous demander pourquoi les JPG ne figurent pas dans votre liste.
os.path.splitext(filename)[1][1:].strip().lower()
Toutes les solutions ci-dessus fonctionnent, mais sur linux, j'ai constaté qu'il y avait une nouvelle ligne à la fin de la chaîne d'extension qui empêcherait les correspondances de réussir. Ajoutez la méthode strip()
à la fin. Par exemple:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
Avec Splitext, il existe des problèmes avec les fichiers à double extension (par exemple, file.tar.gz
, file.tar.bz2
, etc.).
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
mais devrait être: .tar.gz
Les solutions possibles sont ici
Bien que ce soit un sujet ancien, mais je me demande pourquoi il n’y a pas lieu de mentionner une très simple API de python appelée rpartition dans ce cas:
pour obtenir l'extension d'un chemin d'accès absolu à un fichier, vous pouvez simplement taper:
filepath.rpartition('.')[-1]
exemple:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
vous donnera: 'csv'
Surpris, cela n'a pas encore été mentionné:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
Avantages:
Comme fonction:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
Vous pouvez trouver d'excellentes choses dans le module pathlib.
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)
# Output
'.txt'
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
Juste join
tout pathlib suffixes
.
>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'
Vous pouvez utiliser un split
sur un filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Cela ne nécessite pas de bibliothèque supplémentaire
Il s'agit d'une technique de représentation directe sous forme de chaîne: je vois beaucoup de solutions mentionnées, mais je pense que la plupart envisagent la division. Split le fait cependant à chaque occurrence de "." . Ce que vous préférez, c'est la partition.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Même si cette question est déjà posée, j'ajouterais la solution dans Regex.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
Une autre solution avec une scission à droite:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])