Aller au contenu

Les Fichiers

Dans de très nombreuses situations, un programme doit pouvoir récupérer ou écrire des informations dans un fichier. Ce chapitre propose de découvrir les fonctions de Python permettant de le faire. Nous utiliserons trois exemples de fichiers disponibles en téléchargement ci-dessous :

  • le fichier informaticiens.txt qui contient une liste d'informaticiens cĂ©lèbres
  • le fichier films.txt qui contient une liste de films.
  • le fichier dates.txt qui contient une liste de dates au format JJ/MM/AAAA.

Danger

Avant de continuer télécharger ces fichiers (clic droit sur leurs noms puis Enregistrer la cible du lien sous ...) dans un dossier de votre choix, par la suite vous sauvegarderez vos scripts Python de ce chapitre dans ce même répertoire.

Ouverture d'un fichier en lecture seule⚓︎

Pour ouvrir un fichier, on utilise la fonction open, cette fonction prend comme paramètre le nom du fichier et elle renvoie une variable appelée descripteur de fichier. Par exemple, dans l'instruction suivante :

Python
lecteur = open("informaticiens.txt")
la variable lecteur est notre descripteur de fichier, et nous avons ouvert le fichier ayant pour nom sur le disque dur : informaticiens.txt. Il faut interpréter un descripteur de fichier comme un canal de lecture pour accéder à ce fichier.

Si après avoir exécuté le programme ci-dessous vous obtenez un FileNotFoundError: [Errno 2] No such file or directory: c'est que Python ne trouve pas sur votre disque dur le fichier que vous essayez d'ouvrir, on rappelle que le programme Python et le fichier doivent se trouver dans le même répertoire !

A retenir

  • La fonction #!python open permet d'ouvrir un fichier prĂ©sent dans le dossier courant.
  • Cette fonction prend en paramètre un nom de fichier et renvoie un descripteur de fichier.
  • L'erreur FileNotFoundError indique que le fichier n'a pas Ă©tĂ© trouvĂ©.

Lecture d'un fichier⚓︎

Si l'instruction lecteur = open("informaticiens.txt") s'est produite correctement, on dispose maintenant d'un canal de lecture vers le fichier. Pour lire les données on utilise la fonction read sur ce descripteur :

Python
lecteur = open("informaticiens.txt")
# Une fois le fichier ouvert, on effectue les opérations de lecture sur le descripteur
contenu = lecteur.read()
print(contenu)

Comme vous pouvez le constater, la fonction read lit la totalité du fichier en une seule fois ! D'autre part, une fois le fichier lu tout se passe comme si le descripteur de fichier lecteur était arrivé à la fin du fichier, ainsi une deuxième lecture du fichier ne retournera plus aucune donnée (la fin de fichier est déjà atteinte).

Python
lecteur = open("informaticiens.txt")
# Une fois le fichier ouvert, on effectue les opérations de lecture sur le descripteur
contenu = lecteur.read()
print(contenu)
deuxieme_lecture = lecteur.read()
print("Deuxieme lecture :", deuxieme_lecture)

La variable deuxieme_lecture est vide le descripteur de fichier étant positionné "à la fin" il n'y a plus d'informations à lire.

A retenir

  • La fonction read permet de lire la totalitĂ© d'un fichier ouvert avec open.
  • Après lecture, le descripteur de fichier est positionnĂ© en fin de fichier et il n'y a plus d'information Ă  lire.

Une bonne pratique de programmation consiste à fermer un fichier après l'avoir utilisé. C'est le rôle de l'instruction close, le programme précédent devrait donc se terminer par lecteur.close().

  1. En utilisant Python, ouvrir le fichier films.txt
  2. Lire ce fichier et en afficher le contenu
  3. Fermer ce fichier

Au lieu de lire la totalité d'un fichier en une seule fois, il peut être préférable d'en récupérer les lignes soit dans une liste, soit une à une :

  • afin de rĂ©cupĂ©rer les lignes d'un fichier dans une liste, on peut utiliser readlines :

    Python
    lecteur = open("informaticiens.txt")
    lignes = lecteur.readlines()
    print(lignes)
    lecteur.close()
    
    On remarquera bien la différence avec read : ici on obtient une liste, ce qui permet par exemple d'accéder directement à une ligne en particulier du fichier : print(lignes[5]).

  • une autre possibiliĂ© est d'utiliser readline qui a pour effet de lire une seule ligne du fichier puis de positionner le descripteur de fichier sur la ligne suivante :

    Python
    # Ouverture du fichier
    lecteur = open("informaticiens.txt")
    # Lecture de la première ligne 
    ligne1 = lecteur.readline()
    # le pointeur de lecture est positionné à la ligne suivante, un autre appel à readline lira donc la 2e ligne
    ligne2 = lecteur.readline()
    # Lecture terminée on ferme le fichier
    lecteur.close()
    print(ligne1)
    print(ligne2)
    

  • En utilisant readlines lire dans une liste les films prĂ©sents dans le fichiers films.txt. Quel film se trouve sur la ligne 4 (on numĂ©rote les lignes Ă  partir de 0).

  • MĂŞme question en utilisant readline

Ecriture dans un fichier⚓︎

Pour écrire dans un fichier, il faut l'ouvrir en mode 'w' (pour write), si le fichier n'existe pas sur votre disque dur, il sera automatiquement crée :

Python
fichier_prenoms = open("prenoms.txt","w")
fichier_prenoms.write("Alice")
fichier_prenoms.write("John")
fichier_prenoms.write("Billy")
fichier_prenoms.close()
Après exécution de ce programme, un fichier prenoms.txt est crée dans votre répertoire.

  1. Ouvrir le fichier prenoms.txt, le lire et en afficher le contenu Ă  l'aide de Python. Que remarquez-vous ?
  2. Comment ajouter les sauts de lignes ?

Traitement sur les lignes⚓︎

Souvent, chaque donnée d'un fichier se trouve sur une ligne, par exemple le fichier dates.txt (que vous du déjà téléchargé dans votre répertoire travail) contient une date par ligne. En lisant ce fichier avec readlines, on récupère donc une listes de dates mais le saut de ligne final est présent :

Python
reader = open("dates.txt")
contenu = reader.readlines()
print(contenu)
## affiche ['15/01/2012\n', '9/09/2007\n', '24/08/1999\n', '11/04/2000\n']
Pour enlever ce saut de ligne final (et éventuellement aussi des caractères espaces qui se trouveraient en début ou fin de ligne), on peut utiliser strip qui s'applique sur une chaines de caractères et renvoie une copie de cette chaine sans les sauts de lignes ou espace de début et de fin, ce qui donne :
Python
reader = open("dates.txt")
contenu = reader.readlines()
dates = [ligne.strip() for ligne in contenu]
print(dates)
## affiche ['15/01/2012', '9/09/2007', '24/08/1999', '11/04/2000']
Une autre fonction particulèrement intéressant lors de la lecture des fichiers est split qui s'applique sur une chaine de caractères et prend en argument un séparateur. Cette fonction renvoie les sous chaines construites en découpant la chaine de départ suivant le caractère séparateur. Par exemple :
Python
mots = "Python est super".split(" ")
# mots contient ["Python", "est", "super"]
prenoms = "Amélie,Pierre,Jacques,Albert,Susie".split(",")
# prenoms contient ["Amélie","Pierre","Jacques","Albert","Susie"]
valeurs = "5-12-54-11-13-9".split("-")
# valeurs contient ["5", "12", "54", "11", "13", "9"]
Ici, on peut par exemple utiliser cette fonctionnalité pour découper les dates et récupérer directement le jour, le mois et l'année :
Python
reader = open("dates.txt")
contenu = reader.readlines()
dates = [ligne.strip().split("/") for ligne in contenu]
print(dates)
# affiche [['15', '01', '2012'], ['9', '09', '2007'], ['24', '08', '1999'], ['11', '04', '2000']]

Exercices de synthèse⚓︎

  1. Entiers

    1. Le fichier entiers.txt contient sur chaque ligne un entier.

    2. Ecrire une fonction qui prend en paramètre un nom de fichier et retourne le nombre de lignes de ce fichier.

    Aide

    Les données lues dans un fichier sont toujours des chaines de caractères (type str), si on les additionne avec + cela correspond donc à la concaténation des chaines de caractères (comme dans "20" + "24" qui donne "2024"). Pour traiter les valeurs lues dans le fichier comme des entiers, il faudra donc au préalable les convertir en entier !

  2. Dictionnaire Pour cet exercice on utilise le dictionnaire.txt: !!! note pour éviter le problème avec les caractères non ASCII (accents...) on précise un paramètre supplémentaire : l'encodage.

    Text Only
    La fonction qui ouvre le fichier devient :`open('dictionnaire.txt', 'r', encoding='utf-8')`
    
    1. Combien il y a-t-il de mots dans ce dictionnaire ?
    2. Lister tous les mots de 17 lettres de ce dictionnaire.
    3. Quel est le plus grand mot de ce dictionnaire ?
    4. Lister tous les mots de 5 lettres qui ont un d en deuxième position et se terminent par un e.
    5. Lister tous les mots palindromes de ce dictionnaire (un mot palindrome est un mot pouvant se lire indifféremment dans les deux sens par exemple kayak ou été)
  3. Les boîtes Le fichier boites.txt est téléchargeable ci-dessous, chaque ligne de ce fichier contient la référence d'un modèle de boîte sous la forme d'un code à 4 lettres suivi de trois entiers représentant les dimensions de la boîte. A titre d'exemple, les trois premières lignes du fichier sont :

    Text Only
    NWLR 283 75 46 
    QBHC 117 70 79 
    ZOWK 262 66 31
    
    Donc, la boite de référence NWLR a comme dimension 283x75x46.

  4. Trouver la référence de la boite ayant le plus grand volume et indiquer la valeur du volume.