Introduction au langage Python

Lire un fichier texte

L'idée est d'externaliser les données d'un programme par rapport à son code. Par exemple, dans le jeu du pendu, on voudrait que la liste des mots au choix soit écrite dans un fichier extérieur au fichier python.

Pour la suite, recopier et enregistrer les données suivantes dans un fichier nommé mots.txt :

ACAJOU
ALEPHS
AZIMUT
BASSON
BURINE
CAIMAN
CERCLE
COCCYX
CORNEE
FAUCON
GOSPEL
GUENON
HORMIS
MENTHE
MULARD
NOTAIS
NOUAIS
PAGINE
PONTIL
SABORD
SEISME
WHISKY
YANKEE
ZIPPER 

Le langage Python dispose d’une fonction open (et d’une méthode close) pour ouvrir (et fermer) un fichier en mode texte. Ses arguments sont le nom du fichier (en chaine de caractères) et une option qui est 'r' (pour "read") par défaut, pour une ouverture en lecture seule.

>>> fichier = open('mots.txt', 'r')

Cela positionne un curseur de lecture au début du fichier. On peut alors utiliser la méthode readline pour lire une ligne et positionner le curseur au début de la ligne suivante

>>> fichier.readline()
'ACAJOU\n'
>>> fichier.readline()
'ALEPHS\n'

Une fois terminé, il faut bien penser à fermer le fichier avec la méthode close

>>> fichier.close()

Exercice Écrire une fonction de paramètre un nom de fichier, qui...

  1. affiche les trois premières lignes du fichier dans la console :
    >>> affiche_3('mots.txt')
    ACAJOU
    ALEPHS
    AZIMUT
  2. affiche toutes les lignes du fichier dans la console :
    (Aide : la méthode readline renvoie '' quand le curseur est à la fin du fichier.)
  3. enregitre dans une variable la liste de toutes les lignes du fichier.
  1. def affiche_3(nom):
        """ Affiche les trois premières lignes du fichier nom """
        fichier = open(nom)
        for k in range(3):
            print(fichier.readline()[:6])
        fichier.close()
  2. En toute logique, on utiliserait une bloucle while car on ne sait pas combien de lignes comporte le fichier :
    def affiche(nom):
        """ Affiche toutes les lignes du fichier nom """
        fichier = open(nom)
        ligne = fichier.readline()
        while ligne != '':
            print(ligne[:6])
            ligne = fichier.readline()
        fichier.close()

    Mais on peut continuer avec une boucle for (moins intuitive mais plus concise) :

    def affiche(nom):
        """ Affiche toutes les lignes du fichier nom """
        fichier = open(nom)
        for ligne in fichier:
            print(ligne[:6])
        fichier.close()
  3. def lire(nom):
        """ Renvoie la liste de toutes les lignes du fichier nom """
        liste = []
        fichier = open(nom)
        for ligne in fichier:
            liste.append(ligne[:6])
        fichier.close()
        return liste

Exercice

  1. Écrire une fonction de paramètre un nom de fichier, qui renvoie le nombre de ses lignes.
    >>> nb_lignes('mots.txt')
    24
  2. Écrire une fonction de paramètre un nom de fichier, qui renvoie aléatoirement une de ses lignes.
    >>> une_ligne('mots.txt')
    'CERCLE'
  1. def nb_lignes(nom):
        """ Renvoie le nombre de lignes du fichier nom """
        n = 0
        fichier = open(nom)
        ligne = fichier.readline()
        while ligne != '':
            n = n + 1
            ligne = fichier.readline()
        fichier.close()
        return n
  2. from random import randrange
            
    def une_ligne(nom):
        """ Renvoie une ligne au hasard du fichier nom """
        # Choix d'une ligne
        n = randrange(0,nb_lignes(nom)-1)
        fichier = open(nom)
        for k in range(n):
            fichier.readline()
        ligne = fichier.readline()
        fichier.close()
        return ligne[:6]
    ou, sachant que chaque ligne de notre fichier est de la même taille, on peut utiliser les méthodes tell (donne la position du curseur) et seek (positionne le curseur) :
    from random import randrange
            
    def une_ligne(nom):
        """ Renvoie une ligne au hasard du fichier nom """
        n = randrange(0,nb_lignes(nom)-1)
        fichier = open(nom)
        # Taille d'une ligne : m
        fichier.readline()
        m = fichier.tell()
        # Positionnement à la bonne ligne
        fichier.seek(n*m)
        ligne = fichier.readline()
        fichier.close()
        return ligne[:6]

Écrire dans un fichier texte

Il existe plusieurs modes d'ouverture de fichier :

De plus, pour pouvoir écrire sur un fichier ouvert en lecture, ou lire un fichier ouvert en écriture, on peut rajouter un '+' : 'r+', 'a+', 'w+' et 'x+'.

Exercice

On souhaite pouvoir ajouter un mot de 6 lettres à la liste des mots du fichier mots.txt.

  1. Écrire une fonction qui demande et renvoie un mot de 6 lettres écrit en majuscules et vérifiant ces contraintes, quitte à redemander plusieurs fois
  2. Écrire une fonction qui utilise la fonction précédente pour demander un mot et l'ajoute au fichier mots.txt
  3. Modifier cette dernière fonction pour que le mot ne soit ajouté que s'il n'y figure pas déjà.
  1. def demande(n):
        """ Demande un mot de n lettres en majuscules """
        valide = False
        while not valide:
            mot = input('Proposer un mot de '+str(n)+' lettres en majuscules : ')
            valide = len(mot)==6
            for lettre in mot :
                valide = valide and 65<=ord(lettre)<=90
        return mot
  2. def ajoute():
        """ Demande et ajoute un mot de 6 lettres au fichier mots.txt """
        mot = demande(6)
        fichier = open('mots.txt', 'a')
        fichier.write('\n'+mot)
        fichier.close()
  3. def ajoute():
        """ Demande et ajoute un mot de 6 lettres au fichier mots.txt """
        mot = demande(6)
        fichier = open('mots.txt', 'r+')
        existe = False
        ligne = fichier.readline()
        while ligne != '':
            if ligne[:6]==mot:
                existe = True
            ligne = fichier.readline()
        if not existe :
            fichier.write('\n'+mot)
        fichier.close()

Une façon "simple" d'actualiser un fichier, quand il n'est pas trop volumineux, est de le mettre entièrement en mémoire d'un coup, de le modifier en mémoire, puis de le réécrire entièrement.

Pour cela, on peut utiliser la méthode read au lieu de readline :

>>> fichier = open('mots.txt')
>>> lignes = fichier.read()
>>> fichier.close()
>>> print(repr(lignes))
'ACAJOU\nALEPHS\nAZIMUT\nBASSON\nBURINE\nCAIMAN\nCERCLE\nCOCCYX\nCORNEE\nFAUCON\nGOSPEL\nGUENON\nHORMIS\nMENTHE\nMULARD\nNOTAIS\nNOUAIS\nPAGINE\nPONTIL\nSABORD\nSEISME\nWHISKY\nYANKEE\nZIPPER'

On peut aussi utiliser la méthode readlines. Elle fournit l'ensemble des lignes sous la forme d'une liste :

>>> fichier = open('mots.txt')
>>> lignes = fichier.readlines()
>>> fichier.close()
>>> print(lignes)
['ACAJOU\n', 'ALEPHS\n', 'AZIMUT\n', 'BASSON\n', 'BURINE\n', 'CAIMAN\n', 'CERCLE\n', 'COCCYX\n', 'CORNEE\n', 'FAUCON\n', 'GOSPEL\n', 'GUENON\n', 'HORMIS\n', 'MENTHE\n', 'MULARD\n', 'NOTAIS\n', 'NOUAIS\n', 'PAGINE\n', 'PONTIL\n', 'SABORD\n', 'SEISME\n', 'WHISKY\n', 'YANKEE\n', 'ZIPPER']

Exercice

En utilisant cette méthode, (avec read ou readlines), et les fonctionnalités des listes en python, écrire une fonction qui ajoute un mot de 6 lettres à la liste des mots du fichier mots.txt, s'il n'y est pas déjà, et en gardant l'ordre alphabétique.

def ajoute():
    """ Demande et ajoute un mot de 6 lettres au fichier mots.txt """
    mot = demande(6)
    # Lecture du fichier
    fichier = open('mots.txt', 'r')
    lignes = fichier.read().split('\n')
    fichier.close()
    # Mise à jour en mémoire
    position = 0
    while position < len(lignes) and lignes[position] < mot:
        position = position + 1
    if position == len(lignes):
        lignes.append(mot)
    elif lignes[position] != mot:
        lignes.insert(position,mot)
    # Réécriture du fichier
    fichier = open('mots.txt', 'w')
    fichier.write(lignes[0])
    for k in range(1,len(lignes)):
        fichier.write('\n'+lignes[k])
    fichier.close()

Navigation