Comment vérifier si un fichier est lisible en Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce labo (LabEx), vous apprendrez à vérifier si un fichier est lisible en Python. Le labo commence par une exploration des autorisations de fichiers sous Linux, en mettant l'accent sur les concepts de propriétaire, de groupe et d'autres utilisateurs, ainsi que sur les autorisations de lecture, d'écriture et d'exécution. Vous créerez un script Python, examinerez ses autorisations à l'aide de la commande ls -l et interpréterez la sortie pour comprendre qui a accès à la lecture du fichier.

Le labo vous guidera ensuite dans l'utilisation de la fonction os.access() de Python avec os.R_OK pour déterminer de manière programmée si un fichier est lisible. Enfin, vous apprendrez à tenter d'ouvrir le fichier en lecture dans un bloc try...except pour gérer les exceptions IOError potentielles, offrant ainsi une approche pratique pour vérifier la lisibilité des fichiers dans votre code Python.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/ModulesandPackagesGroup -.-> python/standard_libraries("Common Standard Libraries") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/conditional_statements -.-> lab-559513{{"Comment vérifier si un fichier est lisible en Python"}} python/standard_libraries -.-> lab-559513{{"Comment vérifier si un fichier est lisible en Python"}} python/catching_exceptions -.-> lab-559513{{"Comment vérifier si un fichier est lisible en Python"}} python/file_opening_closing -.-> lab-559513{{"Comment vérifier si un fichier est lisible en Python"}} python/file_reading_writing -.-> lab-559513{{"Comment vérifier si un fichier est lisible en Python"}} python/file_operations -.-> lab-559513{{"Comment vérifier si un fichier est lisible en Python"}} end

Comprendre les autorisations de fichiers

Dans cette étape, nous allons explorer les autorisations de fichiers sous Linux, qui sont cruciales pour contrôler l'accès aux fichiers et aux répertoires. Comprendre les autorisations de fichiers est essentiel pour garantir la sécurité et l'intégrité de vos données.

Chaque fichier et répertoire sous Linux a des autorisations associées qui déterminent qui peut lire, écrire ou exécuter le fichier ou le répertoire. Ces autorisations sont classées en trois catégories :

  • Propriétaire : L'utilisateur qui possède le fichier ou le répertoire.
  • Groupe : Le groupe auquel le fichier ou le répertoire appartient.
  • Autres : Tous les autres utilisateurs du système.

Chaque catégorie a trois types d'autorisations :

  • Lecture (r) : Permet à l'utilisateur de visualiser le contenu du fichier ou de lister le contenu du répertoire.
  • Écriture (w) : Permet à l'utilisateur de modifier le contenu du fichier ou de créer, supprimer ou renommer des fichiers dans le répertoire.
  • Exécution (x) : Permet à l'utilisateur d'exécuter le fichier comme un programme ou d'entrer dans le répertoire.

Commençons par créer un fichier et examiner ses autorisations. Ouvrez l'éditeur VS Code et créez un nouveau fichier nommé my_script.py dans le répertoire ~/project. Ajoutez le contenu suivant au fichier :

print("Hello, world!")

Enregistrez le fichier. Maintenant, ouvrez le terminal et accédez au répertoire ~/project :

cd ~/project

Listez les fichiers du répertoire avec des informations détaillées en utilisant la commande ls -l :

ls -l

Vous devriez voir une sortie similaire à celle-ci :

-rw-r--r-- 1 labex labex 22 Oct 26 10:00 my_script.py

Décortiquons la sortie :

  • Les 10 premiers caractères représentent les autorisations de fichier.
  • Le premier caractère indique le type de fichier : - pour un fichier ordinaire, d pour un répertoire, l pour un lien symbolique, etc.
  • Les trois caractères suivants (rw-) représentent les autorisations du propriétaire : lecture et écriture.
  • Les trois caractères suivants (r--) représentent les autorisations du groupe : lecture seule.
  • Les trois derniers caractères (r--) représentent les autorisations pour les autres : lecture seule.
  • 1 indique le nombre de liens physiques (hard links) vers le fichier.
  • labex labex indique le propriétaire et le groupe du fichier.
  • 22 est la taille du fichier en octets.
  • Oct 26 10:00 est la date et l'heure de la dernière modification.
  • my_script.py est le nom du fichier.

Actuellement, le fichier my_script.py a des autorisations de lecture et d'écriture pour le propriétaire (vous) et des autorisations de lecture seule pour le groupe et les autres. Cela signifie que vous pouvez lire et modifier le fichier, mais que les autres utilisateurs ne peuvent que le lire.

Pour exécuter le script Python, vous avez besoin d'autorisations d'exécution. Essayons d'exécuter le script :

python my_script.py

Vous devriez voir la sortie suivante :

Hello, world!

Même si le fichier n'a pas d'autorisations d'exécution, vous pouvez toujours l'exécuter en utilisant l'interpréteur python. La commande python elle-même a des autorisations d'exécution et peut lire et exécuter le contenu du fichier my_script.py.

Dans les étapes suivantes, nous allons explorer comment utiliser Python pour vérifier les autorisations de fichiers et comment les modifier en utilisant des commandes Linux.

Utiliser os.access() avec os.R_OK

Dans cette étape, nous allons utiliser la fonction os.access() en Python pour vérifier si un fichier a des autorisations de lecture. La fonction os.access() prend deux arguments : le chemin du fichier et un indicateur d'autorisation. Nous allons utiliser os.R_OK pour vérifier les autorisations de lecture.

Tout d'abord, créons un nouveau fichier Python nommé check_permissions.py dans le répertoire ~/project. Ouvrez l'éditeur VS Code et ajoutez le code suivant au fichier :

import os

file_path = "my_script.py"

## Vérifier si le fichier existe
if not os.path.exists(file_path):
    print(f"Erreur : Le fichier '{file_path}' n'existe pas.")
else:
    ## Vérifier si le fichier a des autorisations de lecture
    if os.access(file_path, os.R_OK):
        print(f"Le fichier '{file_path}' a des autorisations de lecture.")
    else:
        print(f"Le fichier '{file_path}' n'a pas des autorisations de lecture.")

Enregistrez le fichier. Ce script vérifie d'abord si le fichier my_script.py existe. S'il existe, il utilise ensuite os.access() avec os.R_OK pour vérifier si le fichier a des autorisations de lecture. Le script affichera un message indiquant si le fichier a ou non des autorisations de lecture.

Maintenant, exécutez le script depuis le terminal :

python check_permissions.py

Vous devriez voir la sortie suivante :

Le fichier 'my_script.py' a des autorisations de lecture.

Cela est dû au fait que, par défaut, le fichier my_script.py a des autorisations de lecture pour le propriétaire, le groupe et les autres.

Maintenant, modifions les autorisations du fichier my_script.py pour supprimer les autorisations de lecture pour tous les utilisateurs sauf le propriétaire. Nous pouvons le faire en utilisant la commande chmod dans le terminal.

chmod 600 my_script.py

Cette commande définit les autorisations de my_script.py en lecture et écriture uniquement pour le propriétaire (600 en notation octale).

Maintenant, exécutez à nouveau le script check_permissions.py :

python check_permissions.py

Vous devriez maintenant voir la sortie suivante :

Le fichier 'my_script.py' n'a pas des autorisations de lecture.

Cela est dû au fait que nous avons supprimé les autorisations de lecture pour le groupe et les autres. La fonction os.access() identifie correctement que le fichier n'a plus d'autorisations de lecture pour l'utilisateur exécutant le script (qui est labex).

Enfin, restaurons les autorisations originales du fichier my_script.py :

chmod 644 my_script.py

Cette commande définit les autorisations de my_script.py en lecture et écriture pour le propriétaire et en lecture seule pour le groupe et les autres (644 en notation octale).

Tenter d'ouvrir un fichier en lecture

Dans cette étape, nous allons tenter d'ouvrir le fichier my_script.py en lecture en Python et gérer les exceptions PermissionError potentielles. Cela montrera comment gérer de manière élégante les situations où votre script n'a pas les autorisations nécessaires pour accéder à un fichier.

Tout d'abord, modifions les autorisations du fichier my_script.py pour supprimer les autorisations de lecture pour tous les utilisateurs sauf le propriétaire, comme nous l'avons fait dans l'étape précédente :

chmod 600 my_script.py

Maintenant, créons un nouveau fichier Python nommé open_file.py dans le répertoire ~/project. Ouvrez l'éditeur VS Code et ajoutez le code suivant au fichier :

file_path = "my_script.py"

try:
    with open(file_path, "r") as file:
        content = file.read()
        print("Contenu du fichier :")
        print(content)
except PermissionError:
    print(f"Erreur : Vous n'avez pas la permission de lire le fichier '{file_path}'.")
except FileNotFoundError:
    print(f"Erreur : Le fichier '{file_path}' n'a pas été trouvé.")
except Exception as e:
    print(f"Une erreur inattendue s'est produite : {e}")

Enregistrez le fichier. Ce script tente d'ouvrir le fichier my_script.py en mode lecture ("r"). Il utilise un bloc try...except pour gérer les erreurs potentielles. Si une exception PermissionError se produit (ce qui signifie que le script n'a pas les autorisations de lecture), il affiche un message d'erreur. Il gère également l'exception FileNotFoundError au cas où le fichier n'existerait pas, ainsi qu'une exception générique Exception pour capturer tout autre type d'erreur potentielle.

Maintenant, exécutez le script depuis le terminal :

python open_file.py

Vous devriez voir la sortie suivante :

Erreur : Vous n'avez pas la permission de lire le fichier 'my_script.py'.

Cela est dû au fait que nous avons supprimé les autorisations de lecture pour le groupe et les autres, et le script s'exécute en tant qu'utilisateur labex, qui n'a plus les autorisations de lecture pour le fichier.

Maintenant, restaurons les autorisations originales du fichier my_script.py :

chmod 644 my_script.py

Exécutez à nouveau le script open_file.py :

python open_file.py

Vous devriez maintenant voir le contenu du fichier my_script.py affiché dans la console :

Contenu du fichier :
print("Hello, world!")

Cela montre comment gérer les autorisations de fichiers en Python et comment gérer de manière élégante les situations où votre script n'a pas les autorisations nécessaires pour accéder à un fichier. En utilisant des blocs try...except, vous pouvez empêcher votre script de planter et fournir des messages d'erreur informatifs à l'utilisateur.

Résumé

Dans ce laboratoire (lab), nous avons exploré les autorisations de fichiers sous Linux, en nous concentrant sur la façon dont elles contrôlent l'accès aux fichiers et aux répertoires. Nous avons appris que les autorisations sont catégorisées en trois classes : le propriétaire (owner), le groupe (group) et les autres (others), chacune ayant des autorisations de lecture (read), d'écriture (write) et d'exécution (execute).

Nous avons créé un fichier Python et utilisé la commande ls -l pour examiner ses autorisations, en comprenant comment la sortie représente le type de fichier et les autorisations accordées à chaque classe d'utilisateurs. Cette connaissance de base est essentielle pour comprendre comment vérifier la lisibilité des fichiers dans les étapes suivantes.