
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