Aller au contenu

TP - Python et les fichiers

Dans le dossier [NSI], créez le dossier [F05-Les_Fichiers].
Dans ce dossier, enregistrez sous le nom TPF05.11.py le programme que vous allez créer et compléter au fur et à mesure de ce TP.

Ce TP est un « tutoriel » qui a pour but de vous faire découvrir pas à pas quelques unes des instructions relatives à la manipulation de fichier avec Python.

Attention !

Ne faites pas que des copier/coller : posez-vous des questions afin de comprendre au mieux ces instructions.

Partie A - Créer un nouveau fichier texte

L'instruction :

with open('nom_du_fichier', 'w', encoding='utf-8') as nom_variable:
va créer le fichier texte intitulé nom_du_fichier dans le répertoire courant (cf paragraphe précédent). Ce fichier texte est associé à la variable nom_variable dans le programme.

Attention

Si un fichier de même nom et de même format existe déjà dans le répertoire courant, alors ce fichier est automatiquement effacé et remplacé.

Chemins relatifs

On crée (accède à) un fichier dans un autre répertoire que le courant, en utilisant un adressage relatif dans le nom du fichier :

  • "/" pour descendre,
  • "../" pour remonter d'un dossier.

A vous

  1. Copiez/collez les instructions ci-dessous dans votre programme TPF05.11.py :

    1
    2
    3
    4
    5
    6
    7
    import os             # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Mon_fichier.py', 'w', encoding='utf-8') as fichier:
        # Opérations sur le fichier - partie suivante
        pass
    
  2. Sauvegardez puis exécutez ce programme.

  3. Ouvrez le répertoire [F05-Les_Fichiers].
    Vérifiez que ce répertoire contient à présent deux fichiers :

    Premier fichier

  4. Vous pouvez ouvrir le fichier Mon_fichier.py à l'aide d'un éditeur de texte et vérifier... qu'il est vide !

Partie B - Écrire dans un fichier texte

L'instruction :

nom_variable.write(texte)
permet d'écrire, à la file, du texte (au format str) dans le fichier référencé par la variable nom_variable et ouvert en mode écriture ('w' ou 'a' – voir Partie C).

Rappel

Le caractère qui symbolise un passage à la ligne est '\n'.

A vous

  1. Ouvrez le programme TPF05.11.py à l'aide de votre éditeur Python.
  2. Ajoutez les instructions suivantes à la place des lignes 6 et 7 de votre programme (attention à l'indentation) :

     6
     7
     8
     9
    10
    11
    12
        fichier.write('a = 1 \n')
        fichier.write('b = 1 \n')
        fichier.write('for i in range(10): \n')
        fichier.write('    temp = a \n')
        fichier.write('    a = b \n')
        fichier.write('    b = temp + a \n')
        fichier.write('    print(a) \n')
    
    Contenu du programme TPF05.11.py
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    import os            # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Mon_fichier.py', 'w', encoding='utf-8') as fichier:
        fichier.write('a = 1 \n')
        fichier.write('b = 1 \n')
        fichier.write('for i in range(10): \n')
        fichier.write('    temp = a \n')
        fichier.write('    a = b \n')
        fichier.write('    b = temp + a \n')
        fichier.write('    print(a) \n')
    
  3. Sauvegardez puis exécutez ce programme.

  4. Vous pouvez ouvrir le fichier Mon_fichier.py à l'aide d'un éditeur de texte et vérifier... qu'il n'est plus vide !

    Contenu du fichier Mon_fichier.py

    Premier fichier

Partie C - Ajouter des informations à un fichier

La fonction d'ouverture de fichier open() admet plusieurs paramètres. Parmi ceux-ci :

  • 'w' (signifie « write ») efface le contenu initial du fichier lorsque celui-ci existe déjà (ou bien crée le fichier s'il n'existe pas) puis permet d'écrire dans ce fichier (comme sur une page blanche).
  • 'a' (signifie « append ») permet d'écrire des lignes à la suite du contenu déjà existant.
  • 'r' (signifie « read ») ouvre le fichier en lecture seule et permet de « récupérer » les informations d'un fichier (Parties D, E et F de ce TP).

A vous

  1. Ouvrez le programme TPF05.11.py à l'aide de votre éditeur Python.
  2. Ajoutez les instructions suivantes à la suite de votre programme (attention à la numérotation des lignes) :

    14
    15
    with open('Mon_fichier.py', 'a', encoding='utf-8') as fichier:
        fichier.write('\nprint("Fin de mon premier fichier !") \n')
    
    Contenu du programme TPF05.11.py
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    import os            # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Mon_fichier.py', 'w', encoding='utf-8') as fichier:
        fichier.write('a = 1 \n')
        fichier.write('b = 1 \n')
        fichier.write('for i in range(10): \n')
        fichier.write('    temp = a \n')
        fichier.write('    a = b \n')
        fichier.write('    b = temp + a \n')
        fichier.write('    print(a) \n')
    
    with open('Mon_fichier.py', 'a', encoding='utf-8') as fichier:
        fichier.write('\nprint("Fin de mon premier fichier !") \n')
    
  3. Sauvegardez puis exécutez ce programme.

  4. Vous pouvez ouvrir le fichier Mon_fichier.py à l'aide d'un éditeur de texte et vérifier... qu'une ligne a été ajoutée à la fin de ce fichier !

    Contenu du fichier Mon_fichier.py

    Premier fichier

Partie D - Lire toutes les lignes d'un coup

On peut lire d'un coup toutes les lignes d'un fichier grâce à la méthode .readlines() (avec un « s » à la fin).

Ces lignes sont des chaînes de caractères et elles sont stockées dans un tableau (gourmand en mémoire).

A vous

  1. Ouvrez le programme TPF05.11.py à l'aide de votre éditeur Python.
  2. Ajoutez les instructions suivantes à la suite de votre programme (attention à la numérotation des lignes) :

    17
    18
    19
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        liste_lignes = fichier.readlines()
    print(liste_lignes)
    
    Contenu du programme TPF05.11.py
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import os            # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Mon_fichier.py', 'w', encoding='utf-8') as fichier:
        fichier.write('a = 1 \n')
        fichier.write('b = 1 \n')
        fichier.write('for i in range(10): \n')
        fichier.write('    temp = a \n')
        fichier.write('    a = b \n')
        fichier.write('    b = temp + a \n')
        fichier.write('    print(a) \n')
    
    with open('Mon_fichier.py', 'a', encoding='utf-8') as fichier:
        fichier.write('\nprint("Fin de mon premier fichier !") \n')
    
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        liste_lignes = fichier.readlines()
    print(liste_lignes)
    
  3. Sauvegardez puis exécutez ce programme. Que constatez-vous dans la console :

    Une réponse

    Les lignes du fichier sont stockées dans la liste nommée liste_lignes :

    >>> (executing file "TPF05.11.py")
    ['a = 1 \n', 'b = 1 \n', 'for i in range(10): \n', '    temp = a \n', '    a = b \n', '    b = temp + a \n', '    print(a) \n', '\n', 'print("Fin de mon premier fichier !") \n']
    

    On peut rendre le contenu de cette liste plus lisible en allant à la ligne après chaque virgule de séparation :

    ['a = 1 \n',
    'b = 1 \n',
    'for i in range(10): \n',
    '    temp = a \n',
    '    a = b \n',
    '    b = temp + a \n',
    '    print(a) \n',
    '\n',
    'print("Fin de mon premier fichier !") \n']
    
    On peut constater que les indentations d'une part, et les sauts à la ligne représentés par le caractère '\n' d'autre part, sont conservés.

Partie E - Lire une ligne, puis une autre

On peut lire une seule ligne grâce à la méthode .readline() (sans « s » à la fin). Après la lecture d'une ligne (qui se termine par '\n'...), un « pointeur » va au début de la ligne suivante.

A vous

  1. Ouvrez le programme TPF05.11.py à l'aide de votre éditeur Python.
  2. Ajoutez les instructions suivantes à la suite de votre programme (attention à la numérotation des lignes) :

    21
    22
    23
    24
    25
    26
    27
    28
    print("\nTest de la méthode .readline() :")
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        ligne = fichier.readline()
        print(ligne)
        ligne = fichier.readline()
        print(ligne)
        ligne = fichier.readline()
        print(ligne)
    
    Contenu du programme TPF05.11.py
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import os            # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Mon_fichier.py', 'w', encoding='utf-8') as fichier:
        fichier.write('a = 1 \n')
        fichier.write('b = 1 \n')
        fichier.write('for i in range(10): \n')
        fichier.write('    temp = a \n')
        fichier.write('    a = b \n')
        fichier.write('    b = temp + a \n')
        fichier.write('    print(a) \n')
    
    with open('Mon_fichier.py', 'a', encoding='utf-8') as fichier:
        fichier.write('\nprint("Fin de mon premier fichier !") \n')
    
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        liste_lignes = fichier.readlines()
    print(liste_lignes)
    
    print("\nTest de la méthode .readline() :")
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        ligne = fichier.readline()
        print(ligne)
        ligne = fichier.readline()
        print(ligne)
        ligne = fichier.readline()
        print(ligne)
    
  3. Sauvegardez puis exécutez ce programme. Que constatez-vous dans la console :

    Une réponse

    On constate que le programme a bien « lu » la première ligne grâce à l'instruction de la ligne 23. Puis l'instruction fichier.readline() de la ligne 25 n'a pas recommencé la lecture à partir du début mais a bien effectué la lecture de la deuxième ligne du fichier Mon_fichier.py.

    Test de la méthode .readline() :
    a = 1 
    
    b = 1 
    
    for i in range(10): 
    

    Rappel

    La chaîne de caractères renvoyée par l'instruction fichier.readline() se termine par '\n'. C'est pour cette raison qu'un saut de ligne apparaît dans la console.

Partie F - Lire toutes les lignes, mais une par une

Opérateur « magique » de Python, l'opérateur d'inclusion in s'applique aussi à un fichier ouvert en lecture seule. Il permet de parcourir une par une chaque ligne d'un fichier texte dans une boucle for.

A vous

  1. Ouvrez le programme TPF05.11.py à l'aide de votre éditeur Python.
  2. Ajoutez les instructions suivantes à la suite de votre programme (attention à la numérotation des lignes) :

    30
    31
    32
    33
    print("\nTest de la boucle for :")
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        for ligne in fichier:
            print(ligne.rstrip('\n'))    # .rstrip() enlève le caractère donné en paramètre
    
    Contenu du programme TPF05.11.py
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import os            # Importation du module
    rep = os.getcwd()     # Obtenir le chemin du répertoire courant
    os.chdir(rep)         # Changer de répertoire courant
    
    with open('Mon_fichier.py', 'w', encoding='utf-8') as fichier:
        fichier.write('a = 1 \n')
        fichier.write('b = 1 \n')
        fichier.write('for i in range(10): \n')
        fichier.write('    temp = a \n')
        fichier.write('    a = b \n')
        fichier.write('    b = temp + a \n')
        fichier.write('    print(a) \n')
    
    with open('Mon_fichier.py', 'a', encoding='utf-8') as fichier:
        fichier.write('\nprint("Fin de mon premier fichier !") \n')
    
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        liste_lignes = fichier.readlines()
    print(liste_lignes)
    
    print("\nTest de la méthode .readline() :")
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        ligne = fichier.readline()
        print(ligne)
        ligne = fichier.readline()
        print(ligne)
        ligne = fichier.readline()
        print(ligne)
    
    print("\nTest de la boucle for :")
    with open('Mon_fichier.py', 'r', encoding='utf-8') as fichier:
        for ligne in fichier:
            print(ligne.rstrip('\n'))    # .rstrip() enlève le caractère donné en paramètre
    

    Remarques importantes

    • La variable ligne peut tout à fait être appelée autrement (instruction de la ligne n°32).
      Cependant, la dénommer ainsi rappelle son usage.

    • Chaque ligne du fichier lu peut contenir des « caractères invisibles », en particulier le caractère de passage à la ligne '\n'. La méthode .rstrip('\n') appliquée à la variable ligne permet de supprimer ce caractère lorsqu'il est en dernière position dans cette variable.

  3. Sauvegardez puis exécutez ce programme. Que constatez-vous dans la console :

    Une réponse

    On constate que le programme lit bien successivement chacune des lignes du fichier Mon_fichier.py en supprimant le caractère '\n' de saut à la ligne en fin de ligne.

    Test de la boucle for :
    a = 1 
    b = 1 
    for i in range(10): 
        temp = a 
        a = b 
        b = temp + a 
        print(a) 
    
    print("Fin de mon premier fichier !") 
    

    Rappel

    La chaîne de caractères renvoyée par l'instruction fichier.readline() se termine par '\n'. C'est pour cette raison qu'un saut de ligne apparaît dans la console.