Module OS Python
Ce module fournit une manière portable d’utiliser des fonctionnalités dépendantes du système d’exploitation.
Pathlib vs Module OS
Le module pathlib fournit beaucoup plus de fonctionnalités que celles énumérées ici, comme obtenir le nom de fichier, obtenir l'extension de fichier, lire/écrire un fichier sans l'ouvrir manuellement, etc. Consultez la documentation officielle si vous souhaitez en savoir plus.
Pour un examen plus approfondi des deux, consultez la page Cheatsheet : Chemins de fichiers et de répertoires.
Chemins Linux et Windows
Sous Windows, les chemins sont écrits en utilisant des barres obliques inverses (\) comme séparateur entre les noms de dossiers. Sur les systèmes d’exploitation basés sur Unix tels que macOS, Linux et les BSD, la barre oblique avant (/) est utilisée comme séparateur de chemin. Joindre des chemins peut être un casse-tête si votre code doit fonctionner sur différentes plateformes.
Heureusement, Python nous fournit os.path.join pour gérer cela.
import os
# Joindre les composants du chemin en utilisant le séparateur correct pour l'OS
os.path.join('usr', 'bin', 'spam')
usr\bin\spam
Joindre des chemins est utile si vous devez créer différents chemins de fichiers sous le même répertoire.
my_files = ['accounts.txt', 'details.csv', 'invite.docx']
# Joindre chaque nom de fichier avec le répertoire de base
for filename in my_files:
print(os.path.join('/home/labex/project', filename))
/home/labex/project/accounts.txt
/home/labex/project/details.csv
/home/labex/project/invite.docx
Le répertoire de travail actuel
import os
# Obtenir le répertoire de travail actuel
os.getcwd()
/home/labex/project
# Changer le répertoire de travail actuel
os.chdir('/usr/bin')
# Vérifier le changement
os.getcwd()
/usr/bin
Création de nouveaux dossiers
import os
# Créer des répertoires de manière récursive (crée tous les répertoires parents si nécessaire)
os.makedirs('/tmp/delicious/walnut/waffles')
Chemins absolus vs relatifs
Il existe deux façons de spécifier un chemin de fichier.
- Un chemin absolu, qui commence toujours par le dossier racine
- Un chemin relatif, qui est relatif au répertoire de travail actuel du programme
Il existe également les dossiers point (.) et double point (..). Ce ne sont pas de vrais dossiers, mais des noms spéciaux qui peuvent être utilisés dans un chemin. Un point unique (“dot”) pour un nom de dossier est un raccourci pour “ce répertoire”. Deux points (“dot-dot”) signifient “le dossier parent”.
Gestion des chemins absolus
Pour voir si un chemin est un chemin absolu :
import os
# Vérifier si le chemin est absolu (commence par la racine)
os.path.isabs('/')
True
# Les chemins relatifs retournent False
os.path.isabs('..')
False
Vous pouvez également extraire un chemin absolu :
import os
# Obtenir d'abord le répertoire actuel
os.getcwd()
/home/labex/project
# Convertir le chemin relatif en chemin absolu
os.path.abspath('..')
/home
Gestion des chemins relatifs
Vous pouvez obtenir un chemin relatif à partir d’un chemin de départ vers un autre chemin.
import os
# Obtenir le chemin relatif du chemin de départ au chemin cible
os.path.relpath('/etc/passwd', '/')
etc/passwd
Validité du chemin et du fichier
Vérifier si un fichier/répertoire existe
import os
# Vérifier si le chemin existe (fichier ou répertoire)
os.path.exists('.')
True
os.path.exists('setup.py')
True
os.path.exists('/etc')
True
os.path.exists('nonexistentfile')
False
Vérifier si un chemin est un fichier
import os
# Vérifier si le chemin est un fichier
os.path.isfile('setup.py')
True
os.path.isfile('/home')
False
os.path.isfile('nonexistentfile')
False
Vérifier si un chemin est un répertoire
import os
# Vérifier si le chemin est un répertoire
os.path.isdir('/')
True
os.path.isdir('setup.py')
False
os.path.isdir('/spam')
False
Obtenir la taille d’un fichier en octets
import os
# Obtenir la taille du fichier en octets
os.path.getsize('/usr/bin/python3')
776192
Lister les répertoires
import os
# Lister tous les fichiers et répertoires dans le chemin spécifié
os.listdir('/usr/bin')
['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
--snip--
'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']
Tailles de fichiers de répertoire
AVERTISSEMENT
Les répertoires eux-mêmes ont également une taille ! Vous voudrez peut-être vérifier si un chemin est un fichier ou un répertoire en utilisant les méthodes discutées dans la section précédente.
import os
total_size = 0
# Calculer la taille totale de tous les fichiers dans le répertoire
for filename in os.listdir('/usr/bin'):
# Joindre le chemin du répertoire avec le nom de fichier et obtenir la taille
total_size = total_size + os.path.getsize(os.path.join('/usr/bin', filename))
print(total_size)
1117846456
Suppression de fichiers et de dossiers
Appeler
os.unlink(path)supprimera le fichier au chemin spécifié.Appeler
os.rmdir(path)supprimera le dossier au chemin spécifié. Ce dossier doit être vide de tout fichier ou dossier.
Parcourir une arborescence de répertoires
import os
# Parcourir l'arborescence des répertoires récursivement
for folder_name, subfolders, filenames in os.walk('/tmp/delicious'):
print(f'Le dossier actuel est {folder_name}')
# Itérer sur les sous-répertoires
for subfolder in subfolders:
print(f'SOUS-DOSSIER DE {folder_name}: {subfolder}')
# Itérer sur les fichiers
for filename in filenames:
print(f'FICHIER DANS {folder_name}: filename{filename}')
print('')
Le dossier actuel est /tmp/delicious
SOUS-DOSSIER DE /tmp/delicious: cats
SOUS-DOSSIER DE /tmp/delicious: walnut
FICHIER DANS /tmp/delicious: spam.txt
Le dossier actuel est /tmp/delicious/cats
FICHIER DANS /tmp/delicious/cats: catnames.txt
FICHIER DANS /tmp/delicious/cats: zophie.jpg
Le dossier actuel est /tmp/delicious/walnut
SOUS-DOSSIER DE /tmp/delicious/walnut: waffles
Le dossier actuel est /tmp/delicious/walnut/waffles
FICHIER DANS /tmp/delicious/walnut/waffles: butter.txt