Ce chapitre vous montrera comment exploiter un système de fichier, c'est à dire de passer de dossier à dossier, lister les fichiers, créer des dossiers, etc.
Le module os
Ce module est une bibliothèque dédié aux besoins de gestion de fichiers et de dossiers. Pour tous les exemples de ce chapitre il sera donc indispensable d'importer ce module.
import os
Le chemin d'un fichier / dossier
Chaque fichier ou dossier est associé à une sorte d'adresse qui permet de le trouver facilement sans erreur. Il n'est pas possible de nommer identiquement un fichier dans un même dossier (execpté si l'extension est différente).
Il existe deux type de chemin: le chemin absolu qui part de la racine de votre système de fichier et le chemin relatif qui part du dossier en cours de lecture .
Ainsi si on se trouve dans le dossier /home/olivier , un fichier nommé projets.txt
dans un dossier scripts
aura comme chemin absolu:
/home/olivier/scripts/projets.txt
Et un chemin relatif
scripts/projets.txt
Manipuler les chemins
Pour python un chemin (ou path ), c'est une chaine de caractères, il existe donc des méthodes pour la manipuler.
Je vous invite à consulter l'aide pour le module os.path
:
>>> import os.path >>> help(os.path)
Voici les méthodes les plus utiles:
abspath(path) → Retourne un chemin absolu basename(p) → Retourne le dernier élément d'un chemin commonprefix(list) → Retourne le chemin commun le plus long d'une liste de chemins dirname(p) → Retourne le dossier parent de l'élément exists(path) → Test si un chemin existe getaTime(filename) → Retourne la date du dernier accès au fichier [os.stat()] getctime(filename) → Retourne la date du dernier changement de metadonnées du fichier getmTime(filename) → Retourne la date de la dernière modification du fichier getsize(filename) → Retourne la tailkle d'un fichier (en octets) isabs(s) → Test si un chemin est absolu isdir(s) → Test si le chemin est un dossier isfile(path) → Test si le chemin est un fichier régulier islink(path) → Test si le chemin est un lien symbolique ismount(path) → Test si le chemin est un point de montage join(path, s) → Ajoute un élément au chemin passé en paramètre normcase(s) → Normalise la casse d'un chemin normpath(path) → Normalise le chemin, élimine les doubles barres obliques, etc. realpath(filename) → Retourne le chemin canonique du nom de fichier spécifié (élimine les liens symboliques) samefile(f1, f2) → Test si deux chemins font référence au même fichier réel sameopenfile(f1, f2) → Test si deux objets de fichiers ouverts font référence au même fichier split(p) → Fractionne un chemin d'accès. Retourne un tuple
Quelques exemples d'utilisation:
>>> import os >>> path = "/home/olivier/scripts/cgi-bin/action.py" >>> os.path.dirname(path) '/home/olivier/scripts/cgi-bin' >>> os.path.basename(path) 'action.py' >>> os.path.join(path, "func") '/home/olivier/scripts/cgi-bin/action.py/func' >>> os.path.split(path) ('/home/olivier/scripts/cgi-bin', 'action.py') >>> os.path.abspath(".") '/home/olivier'
Lister les fichiers d'un dossier
Il est possible de récupérer dans une liste tous les éléments d'un dossier grâce à la méthode listdir
:
Exemple:
>>> os.listdir("/home/olivier") ['.bash_history', 'Images', 'script.py']
Les éléments sont retournées dans une liste et inclue les dossiers et les fichiers cachés.
Lister les éléments récursivement
Comment afficher tous les éléments d'un dossier ainsi que ses dossiers enfants? Avec la fonction walk
walk(top, topdown=True, onerror=None, followlinks=False)
Exemple:
# coding: utf-8 import os folder_path = "/mnt/box/files" for path, dirs, files in os.walk(folder_path): for filename in files: print(filename)
Recherche d'éléments par motif
Il est possible de récupérer les dossiers et les fichiers correspondant à un motif.
* → n'importe quel séquence de caractères ? → n'importe quel caractère [] → n'importe quel caractère listé entre les crochets
Il est nécessaire d'importer le module glob
.
import glob
Voici les méthodes:
glob.glob(motif) → Liste les dossiers et les fichiers correspondants au motif glob.iglob(motif) → Idem que glob mais retourne un itérateur
Exemple:
>>> glob.glob("/home/olivier/scripts/*.txt") ['/home/olivier/scripts/data.txt']
Manipuler les éléments
os.makedirs(path) → Créer récursivement tous les dossiers d'un path si ceux-ci n'existent pas os.mkdir(path) → Créer le dernier dossier d'un path. Si un des dossiers n'existe pas une erreur est retournée os.remove(path) → Supprime le fichier / dossier indiqué os.rename(old, new) → Renomme le fichier / dossier indiqué