Skip to content

Obtenir le nom de fichier, le répertoire, l’extension à partir d’une chaîne de chemin en Python

En Python, vous pouvez obtenir le nom de fichier (nom de base), le nom du répertoire (dossier) et l’extension à partir d’une chaîne de chemin ou joindre les chaînes pour générer la chaîne de chemin avec le module os.path dans la bibliothèque standard.

Cet article décrit le contenu suivant.

  • Différence de séparateur de chemin par système d’exploitation
  • Obtenez le nom de fichier (basename) à partir d’un chemin :os.path.basename()
    • Nom de fichier avec extension
    • Nom de fichier sans extension


  • Obtenez le nom du répertoire (dossier) à partir d’un chemin :os.path.dirname()
  • Obtenez la paire de noms de fichier et de répertoire :os.path.split()
  • Remarques sur le moment où une chaîne de chemin indique un répertoire
  • Obtenez l’extension :os.path.splitext()
    • Créer une chaîne de chemin avec une extension différente
    • Obtenir l’extension sans point (point)
    • Exemples de cas comme .tar.gz


  • Créez une chaîne de chemin en combinant les noms de fichier et de répertoire :os.path.join()
    • Créer une chaîne de chemin pour un autre fichier dans le même répertoire


  • Utiliser différents formats de système d’exploitation
  • Exemples pour Windows
    • Barre oblique inverse et chaîne brute
    • Exemples d’obtention de nom de fichier, nom de dossier, extension
    • Obtenir et joindre une lettre de lecteur :os.path.splitdrive()

Utilisez la chaîne de chemin suivante comme exemple.

import os

filepath = './dir/subdir/filename.ext'

L’exemple de code ci-dessous s’exécute sur un Mac. Des exemples pour Windows sont présentés à la fin.

Dans Python 3.4 ou version ultérieure, vous pouvez également obtenir le nom du fichier, le nom du répertoire (dossier), l’extension, etc., avec le module pathlib qui traite les chemins comme des objets.

Différence de séparateur de chemin par système d’exploitation

Le séparateur de chemin dépend du système d’exploitation. UNIX (y compris Mac) utilise la barre oblique / et Windows utilise la barre oblique inverse comme séparateur.

Vous pouvez obtenir le séparateur dans le système d’exploitation exécutant Python avec os.sep ou os.path.sep.

print(os.sep)
# /

print(os.sep is os.path.sep)
# True

Obtenez le nom de fichier (basename) à partir d’un chemin :os.path.basename()

Utilisez os.path.basename() pour obtenir le nom de fichier (basename) à partir d’une chaîne de chemin.

Nom de fichier avec extension

os.path.basename() renvoie le nom du fichier avec l’extension.

filepath = './dir/subdir/filename.ext'
basename = os.path.basename(filepath)
print(basename)
# filename.ext

print(type(basename))
# <class 'str'>

Nom de fichier sans extension

Vous pouvez obtenir le nom de fichier sans l’extension avec os.path.splitext() décrit plus tard.

basename_without_ext = os.path.splitext(os.path.basename(filepath))[0]
print(basename_without_ext)
# filename

os.path.splitext() divise au dernier point (droit) .. Si vous voulez diviser par le premier point (gauche), utilisez split().

filepath_tar_gz = './dir/subdir/filename.tar.gz'

print(os.path.splitext(os.path.basename(filepath_tar_gz))[0])
# filename.tar

print(os.path.basename(filepath_tar_gz).split('.', 1)[0])
# filename

Obtenez le nom du répertoire (dossier) à partir d’un chemin :os.path.dirname()

Utilisez os.path.dirname() pour obtenir le dossier de répertoire (nom) à partir d’une chaîne de chemin.

filepath = './dir/subdir/filename.ext'
dirname = os.path.dirname(filepath)
print(dirname)
# ./dir/subdir

print(type(dirname))
# <class 'str'>

Si vous souhaitez obtenir uniquement le nom du répertoire directement au-dessus du fichier, utilisez os.path.basename().

subdirname = os.path.basename(os.path.dirname(filepath))
print(subdirname)
# subdir

Obtenez la paire de noms de fichier et de répertoire :os.path.split()

Utilisez os.path.split() pour obtenir à la fois le nom du fichier et celui du répertoire (dossier).

os.path.split() renvoie un tuple de nom de fichier renvoyé par os.path.basename() et de nom de répertoire renvoyé par os.path.dirname().

filepath = './dir/subdir/filename.ext'
base_dir_pair = os.path.split(filepath)
print(base_dir_pair)
# ('./dir/subdir', 'filename.ext')

print(type(base_dir_pair))
# <class 'tuple'>

print(os.path.split(filepath)[0] == os.path.dirname(filepath))
# True

print(os.path.split(filepath)[1] == os.path.basename(filepath))
# True

Vous pouvez décompresser le tuple pour l’affecter à chaque variable.

dirname, basename = os.path.split(filepath)
print(dirname)
# ./dir/subdir

print(basename)
# filename.ext

Utilisez os.path.join() décrit plus tard pour joindre les noms de fichiers et de répertoires.

Remarques sur le moment où une chaîne de chemin indique un répertoire

Notez que si la chaîne de chemin indique un répertoire (dossier), le résultat sera différent selon qu’il y a ou non un séparateur à la fin.

Pas de séparateur à la fin :

dirpath_without_sep = './dir/subdir'
print(os.path.split(dirpath_without_sep))
# ('./dir', 'subdir')

print(os.path.basename(dirpath_without_sep))
# subdir

S’il y a un séparateur à la fin, utilisez os.path.dirname() et os.path.basename() pour obtenir le nom du dossier inférieur.

dirpath_with_sep = './dir/subdir/'
print(os.path.split(dirpath_with_sep))
# ('./dir/subdir', '')

print(os.path.basename(os.path.dirname(dirpath_with_sep)))
# subdir

Obtenez l’extension :os.path.splitext()

Utilisez os.path.splitext() pour obtenir l’extension.

os.path.splitext() sépare l’extension et les autres et la renvoie sous forme de tuple. L’extension contient le point ..

filepath = './dir/subdir/filename.ext'
root_ext_pair = os.path.splitext(filepath)
print(root_ext_pair)
# ('./dir/subdir/filename', '.ext')

print(type(root_ext_pair))
# <class 'tuple'>

La concaténation avec l’opérateur + renvoie la chaîne de chemin d’origine.

root, ext = os.path.splitext(filepath)
print(root)
# ./dir/subdir/filename

print(ext)
# .ext

path = root + ext
print(path)
# ./dir/subdir/filename.ext

Créer une chaîne de chemin avec une extension différente

Pour créer une chaîne de chemin avec uniquement l’extension modifiée par rapport à l’original, concaténez le premier élément du tuple renvoyé par os.path.splitext() avec n’importe quelle extension.

other_ext_filepath = os.path.splitext(filepath)[0] + '.jpg'
print(other_ext_filepath)
# ./dir/subdir/filename.jpg

Obtenir l’extension sans point (point)

Si vous souhaitez obtenir l’extension sans le point (point) ., spécifiez la deuxième chaîne et les suivantes avec slice [1:].

ext_without_dot = os.path.splitext(filepath)[1][1:]
print(ext_without_dot)
# ext

Exemples de cas comme .tar.gz

Comme indiqué dans l’exemple ci-dessus, os.path.splitext() se divise au dernier point (à droite). Soyez prudent avec les extensions comme .tar.gz.

filepath_tar_gz = './dir/subdir/filename.tar.gz'
print(os.path.splitext(filepath_tar_gz))
# ('./dir/subdir/filename.tar', '.gz')

Si vous souhaitez diviser par le premier point (à gauche). dans le nom du fichier, utilisez la méthode split() de la chaîne, mais cela ne fonctionne pas si le nom du répertoire contient également le point.

print(filepath_tar_gz.split('.', 1))
# ['', '/dir/subdir/filename.tar.gz']

Après avoir fractionné avec os.path.split(), appliquez la méthode split() de la chaîne et joignez-vous à os.path.join() décrit plus tard.

La chaîne renvoyée par split() ne contient pas de délimiteur, soyez donc prudent si vous souhaitez obtenir une extension avec un point . comme os.path.splitext().

dirname, basename = os.path.split(filepath_tar_gz)
basename_without_ext, ext = basename.split('.', 1)
path_without_ext = os.path.join(dirname, basename_without_ext)
print(path_without_ext)
# ./dir/subdir/filename

print(ext)
# tar.gz

ext_with_dot = '.' + ext
print(ext_with_dot)
# .tar.gz

Créez une chaîne de chemin en combinant les noms de fichier et de répertoire :os.path.join()

Utilisez os.path.join() pour joindre les noms de fichiers et de répertoires afin de créer une nouvelle chaîne de chemin.

path = os.path.join('dir', 'subdir', 'filename.ext')
print(path)
# dir/subdir/filename.ext

Créer une chaîne de chemin pour un autre fichier dans le même répertoire

Si vous souhaitez créer une chaîne de chemin pour un autre fichier dans le même répertoire d’un fichier, utilisez os.path.dirname() et os.path.join().

filepath = './dir/subdir/filename.ext'
other_filepath = os.path.join(os.path.dirname(filepath), 'other_file.ext')
print(other_filepath)
# ./dir/subdir/other_file.ext

Utiliser différents formats de système d’exploitation

Si vous souhaitez manipuler des chaînes de chemin dans un format de système d’exploitation qui n’est pas le système d’exploitation sur lequel Python est actuellement exécuté, importez et utilisez différents modules au lieu du module os.

  • UNIX (y compris Mac actuel) :posixpath
  • Les fenêtres:ntpath
  • Macintosh 9 et versions antérieures :macpath

Étant donné que chaque module a la même interface que os.path, vous pouvez remplacer la partie os.path de l’exemple de code jusqu’à présent par leurs noms de module (tels que ntpath).

Exemples pour Windows

L’exemple de code ci-dessous s’exécute sur Mac à l’aide du module ntpath mentionné ci-dessus. Lors de l’exécution sous Windows, vous pouvez remplacer ntpath par os.path.

Barre oblique inverse et chaîne brute

Le séparateur de chemin dans Windows est la barre oblique inverse .

Pour écrire une barre oblique inverse dans une chaîne, vous devez écrire deux barres obliques inverses pour échapper. print() affiche une barre oblique inverse.

import ntpath

print(ntpath.sep)
# 

print('\')
# 

print(ntpath.sep is '\')
# True

La chaîne brute (r’xxx’) facilite l’écriture d’un chemin Windows car vous pouvez écrire une barre oblique inverse telle quelle. Une chaîne brute et une chaîne normale ont la même valeur.

file_path = 'c:\dir\subdir\filename.ext'
file_path_raw = r'c:dirsubdirfilename.ext'

print(file_path == file_path_raw)
# True

Pour plus d’informations sur les chaînes brutes, consultez l’article suivant.

Exemples d’obtention de nom de fichier, nom de dossier, extension

Cela fonctionne aussi sur Windows.

print(ntpath.basename(file_path))
# filename.ext

print(ntpath.dirname(file_path))
# c:dirsubdir

print(ntpath.split(file_path))
# ('c:\dir\subdir', 'filename.ext')

Obtenir et joindre une lettre de lecteur :os.path.splitdrive()

Utilisez os.path.splitdrive() pour obtenir la lettre de lecteur. L’exemple de code ci-dessous utilise ntpath.splitdrive().

os.path.splitdrive() divise la lettre de lecteur en incluant les deux-points : et autres.

print(ntpath.splitdrive(file_path))
# ('c:', '\dir\subdir\filename.ext')

Si vous souhaitez obtenir uniquement la lettre du lecteur, sélectionnez le premier caractère.

drive_letter = ntpath.splitdrive(file_path)[0][0]

print(drive_letter)
# c

Soyez prudent lorsque vous rejoignez des personnages de lecteur.

Si vous le passez à os.path.join() tel quel, cela ne fonctionnera pas.

print(ntpath.join('c:', 'dir', 'subdir', 'filename.ext'))
# c:dirsubdirfilename.ext

Vous pouvez également spécifier os.sep (ntpath.sep dans l’exemple de code) dans l’argument de os.path.join() ou ajouter un séparateur à la lettre de lecteur.

print(ntpath.join('c:', ntpath.sep, 'dir', 'subdir', 'filename.ext'))
# c:dirsubdirfilename.ext

print(ntpath.join('c:\', 'dir', 'subdir', 'filename.ext'))
# c:dirsubdirfilename.ext