Gestion des fichiers et des dossiers en python

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:

#!/usr/bin/python3
# -*- 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é