Fichiers

Dans ces exercices d'application, nous allons lire et écrire du code html dans des fichiers, avec pour objectif de concevoir une interface à notre jeu de taquin.

str.find()

Dans un premier temps, nous allons nous entraîner à lire un fichier html et à y chercher du contenu.

Si mon_texte est une chaine de caractères, alors mon_texte.find("toto") renvoie un entier (int) qu'il faut interpréter de la façon suivante :

  • Si mon_texte.find('toto') == -1, c'est que 'toto' n'est pas préent dans la chaine mon_texte
  • Si mon_texte.find('toto') >= 0, ce nombre donne la première position dans mon_texte où l'on trouve 'toto'

Exemples


>>>mon_texte = "Mon nom est toto rototo"
>>>mon_texte.find('toto') 
12
>>>mon_texte.find('jojo')
-1

Si on veut trouver une autre occurence de 'toto' dans cette chaine, on peut ajouter en paramètre à .find la position à partir de laquelle on veut lancer la recherche. Si on met ici 13, on cherchera après le premier 't' de "toto rototo" :


>>>mon_texte = "Mon nom est toto rototo"
>>>mon_texte.find('toto',13) 
19

Le trouve-t-on une troisième fois ? Non.


>>>mon_texte = "Mon nom est toto rototo"
>>>mon_texte.find('toto',20) 
-1

L'exercice est le suivant : télécharger la solution de Samy Vincent pour l'énigme 2 du club de maths (dans un fichier "somme.html"), l'ouvrir comme une liste de ligne dans un programme python puis trouver les numéros des lignes contenant "<body" et "</body>". Enfin, écrire le contenu du fichier, auquel on aura retiré tout le contenu se trouvant entre les balises <body> et "</body>", dans un fichier "somme_vide.html".

str.replace()

Nous allons modifier un modèle de document HTML pour générer une page reflétant le contenu de variables python.

L'appel ma_chaine.replace(a,b) renvoie une nouvele chaine où l'on remplace toutes les occurences de la chaine «a» par la chaine «b» dans la chaine «ma_chaine»»

Exemples de ce que l'on pourrait voir dans une console python


>>>mon_texte = "Mon nom est toto rototo"
>>>mon_texte.replace('nom', 'prénom') 
'Mon prénom est toto rototo'
>>>mon_texte.replace('toto', 'kilyan')
'Mon nom est kilyan rokilyan'

La première substitution, ligne 2, n'est pas prise en compte à la ligne 4 car mon_texte n'a pas été modifié. Si on veut faire plusieurs substitutions à la suite, on peut sauvegarder le résultat intermédiaire, ou bien empiler les appels de .replace.


mon_texte = "Mon nom est toto rototo"
mon_texte2 = mon_texte.replace('nom', 'prénom') # résultat intermédiaire 
mon_texte2.replace('toto', 'kilyan') # on effectue la subtitution dans le résultat intermédiaire
# résultat : 'Mon prénom est kilyan rokilyan'

mon_texte.replace('nom', 'prénom').replace('toto', 'kilyan') # deux appels successifs de .replace
# résultat : 'Mon prénom est kilyan rokilyan'

Le fichier fiche_vide.html contient la fiche d'un joueur dans un jeu en ligne.

    1. Placer le contenu complet du fichier fiche_vide.html dans une seule chaine de caractères
    2. Remplacer dans cette chaine ##JOUEUR## par «kilyan» et ##SCORE## par «31415»
    3. Écrire le réultat dans un fichier «fiche_kilyan.html»
  1. Créer 99 fiches de joueurs sous les nom «fiche_jN.html» pour N allant de 1 à 99, avec dans ces fiches «joueur N» à la place de ##JOUEUR## et un entier aléatoire entre 1000 et 50000 à la place de ##SCORE## (pour l'entier aléatoire, on pourra utiliser random.randint(1000,50000) ).

vers le jeu de taquin

L'objectif de cete exercice est de préparer l'interface de notre jeu de taquin. Elle prendra comme base pour cet exercice le fichier taquin_vide.html.

  1. Proposer une fonction remplir_un qui prend en argument une liste de listes de nombres, et dont le rôle est de produire un fichier "taquin_plein.html" qui reprend le contenu de "taquin_vide.html" en remplaçant le commentaire html <!-- PLATEAU --> par une table html qui affiche la liste de liste. Par exemple, après remplir_un([[1,2],[3,4]]), le fichier taquin_plein.html doit contenir quelque chose comme
    
    <!doctype html>
    <html>
      <head>
        <title>Jeu de taquin</title>
        <meta charset="utf-8">
        <style>
          #plateau table {
          border-collapse: separate;
          border-margin:10px;
          }
          #plateau td {
          border: 1px solid black;
          width:80px;
          height:80px;
          text-align:center;
          }
        </style>
      </head>
      <body>
    
        <header>
          <h1>Jeu de taquin</h1>
        </header>
    
        <section>
    
          <table id="plateau">
    <tr>
    <td>1</td>
    <td>2</td>
    </tr>
    <tr>
    <td>3</td>
    <td>4</td>
    </tr>
          </table>
    
        </section>
    
      </body>
    </html>
    
  2. Même question avec une fonction remplir_deux qui prend deux arguments : une liste de listes et une liste de coordonnées (fournies par exemple par la fonction «candidats» du DM python !). Les cases dont les coordonnées sont présentes dans la liste en question devront afficher leur contenu dans un lien (avec, pour le moment, href="#").