web-dev-qa-db-fra.com

Extraction de l'extension du nom de fichier dans Python

Existe-t-il une fonction permettant d'extraire l'extension d'un nom de fichier?

1113
Alex

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', '')
1725
nosklo
import os.path
extension = os.path.splitext(filename)[1]
356
Brian Neal

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!

152
JeromeJ
import os.path
extension = os.path.splitext(filename)[1][1:]

Pour obtenir uniquement le texte de l'extension, sans le point.

98
wonzbak

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
65
Murat Çorlu

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()
33
blented

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() 
15
yamex5

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

13
XavierCLL

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'

10
weiyixie

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:

  • Fonctionne comme prévu pour tout ce que je peux penser
  • Aucun module
  • Pas de regex
  • Multiplateforme
  • Facilement extensible (par exemple, pas de points principaux pour l’extension, seulement la dernière partie de l’extension)

Comme fonction:

def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None
8
PascalVKooten

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'
8
r3t40
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
8
staytime

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'
6
Alex

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

6
soheshdoshi

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]
4
Kenstars

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'
3
Micha

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])