Les fichiers en Python — résumé 4SI

4SI

Résumé du chapitre. Cours complet, exercices et quiz : Les fichiers — 4SI.

Aller à :

Fichiers texte

1. Définition et caractéristiques

Un fichier texte est un fichier séquentiel constitué d’une suite de lignes, chaque ligne étant une chaîne de caractères.

Chaque ligne se termine par le caractère spécial "\n" (retour à la ligne).

Un fichier texte permet de stocker des informations permanentes sous une forme lisible par l’homme (caractères, chiffres, symboles).

Les valeurs numériques y sont enregistrées sous forme textuelle.

2. Ouverture et modes d’accès

ModeSignificationUsage
"r"LectureLire un fichier existant
"w"ÉcritureCréer ou remplacer un fichier
"a"AjoutAjouter du texte à la fin du fichier

Exemple :

f = open("notes.txt", "r")

ouvre le fichier physique notes.txt en lecture.

3. Parcourir un fichier texte

def parcourir_texte(nom_fichier):
    f = open(nom_fichier, "r")
    ligne = f.readline()
    while ligne != "":
        ligne = ligne[:len(ligne)-1]
        # traitement sur la ligne
        ligne = f.readline()
    f.close()

N.B. : Le retrait ligne[:len(ligne)-1] suppose que chaque ligne, y compris la dernière, se termine par "\n". C’est le cas de tout fichier rempli avec f.write(ch + "\n").

4. Afficher le contenu

a) Affichage total

def afficher_total(nom_fichier):
    f = open(nom_fichier, "r")
    contenu = f.read()
    print(contenu)
    f.close()

b) Affichage selon condition

def afficher_selon_condition(nom_fichier):
    f = open(nom_fichier, "r")
    ligne = f.readline()
    while ligne != "":
        ligne = ligne[:len(ligne)-1]
        if (condition sur la ligne):
            print(ligne)
        ligne = f.readline()
    f.close()

5. Remplir un fichier texte

a) Nombre de lignes connu

def remplir_texte(nom_fichier, n):
    f = open(nom_fichier, "w")
    for i in range(n):
        ch = input("Donner une ligne : ")
        f.write(ch + "\n")
    f.close()

b) Nombre de lignes inconnu

def remplir_texte(nom_fichier):
    f = open(nom_fichier, "w")
    rep = "O"
    while rep == "O":
        ch = input("Donner une ligne : ")
        f.write(ch + "\n")
        rep = input("Ajouter une autre ligne O/N ? ")
        while not (rep == "O" or rep == "N"):
            rep = input("Répondez par O ou N : ")
    f.close()

6. Compter les lignes

def nombre_lignes(nom_fichier):
    f = open(nom_fichier, "r")
    n = 0
    ligne = f.readline()
    while ligne != "":
        n = n + 1
        ligne = f.readline()
    f.close()
    return n

7. Rechercher une chaîne

def rechercher_chaine(nom_fichier, motif):
    f = open(nom_fichier, "r")
    trouve = False
    ligne = f.readline()
    while (ligne != "") and (not trouve):
        ligne = ligne[:len(ligne)-1]
        if (condition de recherche):
            trouve = True
        else:
            ligne = f.readline()
    f.close()
    return trouve

8. Supprimer les lignes égales à une chaîne

from numpy import array

def supprimer_ligne(nom_fichier, ligne_sup):
    f = open(nom_fichier, "r")
    t = array([str]*100)
    n = 0
    ligne = f.readline()
    while ligne != "":
        ligne = ligne[:len(ligne)-1]
        if ligne != ligne_sup:
            t[n] = ligne
            n = n + 1
        ligne = f.readline()
    f.close()

    f = open(nom_fichier, "w")
    for i in range(n):
        f.write(t[i] + "\n")
    f.close()

N.B. : Le tableau t est déclaré pour 100 lignes au plus : un fichier plus long provoque une erreur (IndexError). On adapte cette taille à la borne donnée par l’énoncé.

N.B. : array([str]*100) et array([""]*100, dtype='U50') conservent les chaînes entières. Attention à array([str()]*100), array([""]*100) et array([""]*100, dtype=str) : ces trois écritures tronquent chaque chaîne à un seul caractère.

9. Trier les lignes

from numpy import array

def trier_fichier_texte(nom_fichier):
    f = open(nom_fichier, "r")
    t = array([str]*100)
    n = 0
    ligne = f.readline()
    while ligne != "":
        t[n] = ligne[:len(ligne)-1]
        n = n + 1
        ligne = f.readline()
    f.close()

    trier_tableau(t,n)

    f = open(nom_fichier, "w")
    for i in range(n):
        f.write(t[i] + "\n")
    f.close()

N.B. : trier_tableau(t, n) désigne n’importe quelle méthode de tri vue en cours (sélection, bulles, insertion), appliquée aux n premières cases du tableau.

Points essentiels — fichiers texte

  • Un fichier texte contient des chaînes de caractères
  • Chaque ligne se termine par "\n"
  • Lecture séquentielle avec readline()
  • Suppression du retour avec ligne[:len(ligne)-1]
  • Toujours fermer le fichier avec f.close()

Fichiers binaires

1. Définition

Un fichier binaire est un fichier séquentiel d’éléments en forme binaire.

Chaque élément peut être :

  • une valeur simple (entier, réel, chaîne, booléen)
  • un enregistrement (structure avec plusieurs champs)

Remarque : Dans le programme tunisien, tous les éléments d’un fichier binaire sont du même type.

from pickle import dump, load

2. Modes d’accès

ModeSignificationUsage
"rb"Lecture binaireLire un fichier binaire
"wb"Écriture binaireCréer ou remplacer
"ab"Ajout binaireAjouter à la fin
f = open("eleves.dat", "rb")

3. Remplir un fichier

a) Nombre d’éléments connu

from pickle import dump

def remplir_binaire(nom_fichier, n):
    f = open(nom_fichier, "wb")
    for i in range(n):
        e = dict()
        e['np'] = input("Nom et prénom : ")
        e['moy'] = float(input("Moyenne : "))
        dump(e, f)
    f.close()

b) Nombre d’éléments inconnu

from pickle import dump

def remplir_binaire(nom_fichier):
    f = open(nom_fichier, "wb")
    rep = "O"
    while rep == "O":
        e = dict()
        e['np'] = input("Nom et prénom : ")
        e['moy'] = float(input("Moyenne : "))
        dump(e, f)
        rep = input("Ajouter un élève O/N ? ")
        while not (rep == "O" or rep == "N"):
            rep = input("Répondez par O ou N : ")
    f.close()

4. Parcourir un fichier

from pickle import load

def parcourir_binaire(nom_fichier):
    f = open(nom_fichier, "rb")
    fin = False
    while not(fin):
        try:
            e = load(f)
            # traitement sur e
        except:
            fin = True
    f.close()

Remarque : Le bloc except intercepte toutes les erreurs, et pas seulement la fin du fichier. Une erreur dans le traitement, un champ mal nommé par exemple, arrête la boucle sans aucun message : si le parcours s’arrête trop tôt, c’est là qu’il faut chercher.

5. Afficher le contenu

from pickle import load

def afficher_binaire(nom_fichier):
    f = open(nom_fichier, "rb")
    fin = False
    while not(fin):
        try:
            e = load(f)
            # affichage selon le type
        except:
            fin = True
    f.close()

6. Afficher selon condition

from pickle import load

def afficher_selon_condition(nom_fichier):
    f = open(nom_fichier, "rb")
    fin = False
    while not(fin):
        try:
            e = load(f)
            if (condition sur e):
                # affichage
        except:
            fin = True
    f.close()

7. Rechercher un élément

from pickle import load

def rechercher_binaire(nom_fichier, valeur):
    f = open(nom_fichier, "rb")
    fin = False
    trouve = False
    while not(fin) and not(trouve):
        try:
            e = load(f)
            if (condition de recherche):
                trouve = True
        except:
            fin = True
    f.close()
    return trouve

8. Supprimer un élément

from pickle import dump, load
from numpy import array

def supprimer_binaire(nom_fichier, condition_sup):
    f = open(nom_fichier, "rb")
    t = array([dict()]*100)
    n = 0
    fin = False
    while not(fin):
        try:
            e = load(f)
            if not (condition_sup sur e):
                t[n] = e
                n = n + 1
        except:
            fin = True
    f.close()

    f = open(nom_fichier, "wb")
    for i in range(n):
        dump(t[i], f)
    f.close()

N.B. : Le tableau t est déclaré pour 100 éléments au plus : un fichier plus long provoque une erreur (IndexError). On adapte cette taille à la borne donnée par l’énoncé.

9. Trier les éléments

from pickle import dump, load
from numpy import array

def trier_fichier_binaire(nom_fichier):
    f = open(nom_fichier, "rb")
    t = array([dict()]*100)
    n = 0
    fin = False
    while not(fin):
        try:
            t[n] = load(f)
            n = n + 1
        except:
            fin = True
    f.close()

    trier_tableau(t,n)

    f = open(nom_fichier, "wb")
    for i in range(n):
        dump(t[i], f)
    f.close()

N.B. : trier_tableau(t, n) désigne n’importe quelle méthode de tri vue en cours (sélection, bulles, insertion), appliquée aux n premières cases du tableau. La comparaison porte sur un champ, par exemple t[i]['moy'], et non sur l’enregistrement entier.

Points essentiels — fichiers binaires

  • Un fichier binaire contient des éléments de même type
  • Écriture et lecture avec dump() et load()
  • Parcours séquentiel avec try/except
  • Toujours fermer avec f.close()

Pour aller plus loin : le cours complet, les exercices corrigés et le quiz dans Les fichiers — 4SI.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *