Python: les fichiers (2/3) – le module os

Pour une lecture plus agréable (page plus large), je vous invite à cliquer sur ce lien et à lire ce chapitre dans la rubrique consacrée au langage Python.

Lorsque j’ouvre un fichier en mode écriture et que ce dernier n’existe pas, alors il est créé dans le répertoire courant, c’est-à dire à l’endroit ou le script est lancé. Prenons un exemple concret.

#!/usr/bin/env python3
# -*- coding: utf8 -*-

bonjour = "Bonjour et bienvenue dans mon antre!"
with open('test_file', 'w') as file_:
    file_.write(bonjour)
print(bonjour)

Bonjour et bienvenue dans mon antre!

  • Mon script s’appelle fichier_2.py.
  • Il se trouve dans /home/benoit qui est donc le répertoire courant.
  • Le chemin absolu du script est /home/benoit/fichier_2.py
  • Le chemin relatif est fichier_2.py.
  • Dans ce script, j’ai ouvert (en écriture) un fichier test_file dans lequel j’ai écrit le contenu de la variable bonjour. Le fichier test_file est créé par défaut dans le répertoire courant car j’ai utilisé son chemin relatif.

Si je veux connaitre le répertoire courant, il me faut importer le module os et faire appel à la méthode os.getcwd(). Cela signifie get current working directory. (= obtenir le répertoire courant)

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os

cwd = os.getcwd()
print(cwd)
bonjour = "Bonjour et bienvenue dans mon antre!"
print(bonjour)

/home/benoit
Bonjour et bienvenue dans mon antre!

Le répertoire courant, c’est-à dire l’endroit où le script est lancé, est donc /home/benoit. Si je lance le script dans un émulateur de terminal, il me suffit de taper ./fichier_2.py.

terminal_fichier_2

Déplacement du script dans mon dossier /home/benoit/Documents.

À présent, je vais déplacer ce script intitulé fichier_2.py dans mon dossier Documents. Le chemin absolu devient donc:

/home/benoit/Documents/fichier_2.py

Que devient le répertoire courant? Faisons le test en reprenant le code:

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os

cwd = os.getcwd()
print(cwd)
bonjour = "Bonjour et bienvenue dans mon antre!"
with open('test_file', 'w') as file_:
    file_.write(bonjour)
print(bonjour)

Dans un environnement de développement intégré IDLE3

Si je lance le script à l’aide de l’environnement de développement intégré IDLE3, le répertoire courant devient /home/benoit/Documents. Quant au fichier test_file, il est créé dans ce répertoire courant.

  • Son chemin absolu est donc /home/benoit/Documents/test_file.
  • Son chemin relatif est test_file.

Dans un émulateur de terminal

Par contre, si je lance le script dans un un émulateur de terminal, le répertoire courant est toujours /home/benoit par défaut. Et le fichier test_file est créé dans ce répertoire courant.

  • Son chemin absolu est donc /home/benoit/test_file.
  • Son chemin relatif est test_file.

Pour ce qui est du script fichier_2.py:

  • son chemin absolu est  /home/benoit/Documents/fichier_2.py
  • son chemin relatif devient Documents/fichier_2.py

terminal_fichier_2_2

Tout ceci pour vous dire que cette histoire de répertoire courant peut s’avérer un peu déroutante pour celui qui se lance dans l’apprentissage du Python.

D’aucuns vont me dire qu’il suffit de toujours utiliser le chemin absolu pour ouvrir un fichier mais ce n’est pas une bonne idée. Pourquoi donc? parce que si vous exportez votre programme chez un autre utilisateur, son répertoire courant sera différent (sauf coup de bol) et votre programme ne s’exécutera pas.

Par exemple, le chemin absolu du fichier test_file que je viens de créer en utilisant un émulateur de terminal est : /home/benoit/test_file. Or, tout le monde ne s’appelle pas Benoît. Certains s’appellent Sigismond, Côme, Alceste ou Antiphane. C’est leur droit. Du coup, il y a fort à parier qu’un tel script ne s’exécutera pas (à cause de la ligne 5):

#!/usr/bin/env python3
# -*- coding: utf8 -*-

bonjour = "Bonjour et bienvenue dans mon antre!"
with open('/home/benoit/test_file', 'w') as file_:
    file_.write(bonjour)

De toute manière, il faut savoir que toutes les opérations sur des fichiers s’effectuent systématiquement en se basant sur le répertoire courant dès que le nom du fichier passé n’est pas un chemin absolu (donc dès qu’il ne démarre pas par / sur les systèmes Posix ou x:\ sous Windows). Par conséquent, le code ci-dessous s’exécutera sur n’importe quel ordinateur :

#!/usr/bin/env python3
# -*- coding: utf8 -*-

bonjour = "Bonjour et bienvenue dans mon antre!"
with open('test_file', 'w') as file_:
    file_.write(bonjour)

Changer de répertoire avec os.chdir() et la commande cd

la commande cd fournie par l’interpréteur en ligne de commande Bash

Cette commande bash s’utilise dans un émulateur de terminal et elle permet de modifier le répertoire courant. cd signifie change directory. Je rappelle que le répertoire courant d’un émulateur de terminal est toujours par défaut le répertoire utilisateur (/home/benoit en ce qui me concerne). Pour le modifier, il suffit par exemple de rentrer cd Documents et le répertoire courant deviendra /home/benoit/Documents. Observez la capture d’écran ci-dessous et constatez par vous-même que l’invite de commande à changé : benoit@benoit-GA-880GM-UDH:~/Documents$

cd

La méthode os.chdir()

On peut également modifier le répertoire courant dans le script grâce à la méthode os.chdir(). Là encore, chdir signifie change directory.

Les deux codes ci-dessous exécutent le même programme. Le script fichier_2.py est placé dans /home/benoit tandis que le chemin du fichier test_file est /home/benoit/Documents. Ce sont les lignes 5 et 8-9 qui nous intéressent.

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os
os.chdir(os.getcwd() + "/Documents")
cwd = os.getcwd()
print(cwd)
bonjour = "Bonjour et bienvenue dans mon antre!"
with open('test_file', 'w') as file_:
    file_.write(bonjour)

/home/benoit/Documents

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os
cwd = os.getcwd()
print(cwd)
bonjour = "Bonjour et bienvenue dans mon antre!"
with open('Documents/test_file', 'w') as file_:
    file_.write(bonjour)

/home/benoit

Aperçu de quelques méthodes du module os.path()

Le code ci-dessous vous montre quelques méthodes du module os.path, à savoir :

  • abspath() qui retourne le chemin absolu du fichier passé en argument.
  • basename() qui retourne le nom de base du chemin absolu d’un fichier passé en argument.
  • dirname() qui retourne le nom du répertoire parent du fichier passé en argument.
  • split() qui fractionne un chemin absolu passé en argument et retourne un tuple

Ce n’est qu’un aperçu. Il existe d’autres méthodes que je vous invite à découvrir en consultant la documentation officielle.

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os.path
os.chdir(os.getcwd() + "/Documents")
cwd = os.getcwd()

bonjour = "Bonjour et bienvenue dans mon antre!"
with open('test_file', 'w') as file_:
    file_.write(bonjour)

absolute_path = os.path.abspath('test_file')
basename = os.path.basename(absolute_path)
dirname = os.path.dirname(absolute_path)
split = os.path.split(absolute_path)

print("Répertoire courant = {}".format(cwd))
print("Chemin absolu = {}".format(absolute_path))
print("Nom de base = {}".format(basename))
print("Nom du répertoire parent = {}".format(dirname))
print("Fractionnement du chemin absolu = {}".format(split))

Répertoire courant = /home/benoit/Documents

Chemin absolu = /home/benoit/Documents/test_file
Nom de base = test_file
Nom du répertoire parent = /home/benoit/Documents
Fractionnement du chemin absolu = (‘/home/benoit/Documents’, ‘test_file’)

La méthode os.listdir()

Cette méthode retourne une liste contenant les noms de toutes les entrées d’un répertoire passé en argument. Je vais appliquer par exemple os.listdir() sur un de mes répertoires intitulé mon_jardin.

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os
print(os.listdir("/home/benoit/mon_jardin"))

[‘notes_tomates’, ‘note_number’, ‘species.py’, ‘entrylist’, ‘validated’, ‘images_fruits’, ‘images’, ‘legumes’, ‘entrees_agenda’, ‘phototheque.py’, ‘.gitkeep’, ‘images_legumes’, ‘calendrier.py’, ‘accueil.py’, ‘agenda.py’, ‘dossiers_images’, ‘__pycache__’, ‘jardin.desktop’, ‘fruits’, ‘README.md’, ‘module_notes.py’, ‘file_color’, ‘varietes_tomates’]

La méthode os.rename(src, dst)

Renomme le fichier ou le répertoire source (src)  en dst (destination).

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import os
os.rename("/home/benoit/mon_jardin", "/home/benoit/mon_ordinateur")

mon_ordinateur

La méthode os.remove(path)

Supprime le chemin passé en argument (path). Si path est un répertoire, Python lève une exception. Pour supprimer un répertoire, il faut utiliser la commande os.rmdir() qui ne fonctionne que si le répertoire est vide! Si tel n’est pas le cas, Python lève là-encore une exception!

La méthode os.mkdir(path)

Cette méthode créé un répertoire nommé path.

#!/usr/bin/env python3

import os
os.mkdir('/home/benoit/ma_voiture')

ma_voiture

Auteur : Ordinosor

Bienvenue sur Miamondo, mon blog personnel. "Mia mondo", c'est de l'espéranto et ça signifie "Mon monde" en français. Je m'appelle Benoît alias Ordinosor, Français expatrié en Allemagne. Mes centres d'intérêt sont les distributions GNU/Linux, le langage de programmation Python, la science-fiction et l'espéranto.

2 réflexions sur « Python: les fichiers (2/3) – le module os »

  1. Pour info, quand tu veux ouvrir un fichier, tu n’as pas besoin de faire préalablement un getcwd().

    open(getcwd() + os.sep + « toto.txt ») et open(« toto.txt ») donneront strictement le même résultat.

    En effet, toutes les opérations sur des fichiers se font systématiquement relativement à cwd dès que le nom de fichier passé n’est pas un chemin absolu (donc dès qu’il ne démarre pas par / sur les systèmes Posix ou x:\ sous Windows).

    J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s