Chaînes et fichiers☘
Dans cette page d'exercices, nous allons un peu plus loin en créant un fichier html à l'aide de Python.
Le code mélange donc du python, du css, de l'html... Il vous faudra peut-être revenir plus tard dans l'année sur ce code pour bien comprendre le rôle de chaque instruction.
Exercice 1☘
On considère le code Python suivant:
def structure(v):
return """
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title> table </title>
<style>
html{{font-size: 20px;}}
body{{width: 80%; margin: 0 auto;}}
table{{border: 2px ridge orange;}}
td{{padding:3px;}}
</style>
</head>
<body>
<table>
{}
</table>
</body>
</html>
""".format(v)
def table(n, s):
"""
n -- entier > 0
s -- entier > 0
"""
ch =''
for k in range(0, s+1):
ligne = "<tr><td>{}×{}</td><td>=</td><td>{}</td></tr>".format(k, n, k*n)
ch = ch + ligne + '\n'
return ch
def creeFichier(nom, chaine):
"""
nom -- chaîne de caractères, nom d'un fichier à créer
chaine -- chaîne de caractères, chaîne à inscrire dans le fichier à créer
"""
# on crée un fichier html qui sera nommé nom:
with open(nom + '.html', 'w') as f:
# on écrit la chaine dans ce fichier:
print(chaine, file=f)
creeFichier('table7', structure(table(7, 12)))
- Tester ce code python. Quel est son effet?
Réponse
Le code crée (dans le même répertoire que le fichier du script python) un fichier html nommé table7.html et contenant un tableau de la table du 7.
- Dans l'exécution précédente, que vaut la variable
v
paramètre de la fonctionstructure
lors de l'exécution de cette fonctionstructure
?
Réponse
La fonction structure
est appelée avec l'argument table(7, 12)
. Lors de l'exécution
de la fonction structure
, la variable v
reçoit donc cette valeur.
La valeur de table(7, 12)
est la chaîne suivante:
<tr><td>0×7</td><td>=</td><td>0</td></tr>
<tr><td>1×7</td><td>=</td><td>7</td></tr>
<tr><td>2×7</td><td>=</td><td>14</td></tr>
<tr><td>3×7</td><td>=</td><td>21</td></tr>
<tr><td>4×7</td><td>=</td><td>28</td></tr>
<tr><td>5×7</td><td>=</td><td>35</td></tr>
<tr><td>6×7</td><td>=</td><td>42</td></tr>
<tr><td>7×7</td><td>=</td><td>49</td></tr>
<tr><td>8×7</td><td>=</td><td>56</td></tr>
<tr><td>9×7</td><td>=</td><td>63</td></tr>
<tr><td>10×7</td><td>=</td><td>70</td></tr>
Cette chaîne contient le code html des lignes de la table de multiplication du 7 (sans les
balises <table></table>
).
- Modifier le nécessaire pour créer un fichier table9.html contenant la table du 9 de 0×9 à 20×9.
Réponse
Il suffit de modifier la dernière ligne en la ligne suivante:
creeFichier('table9', structure(table(9, 20))
- Dans ce qui est renvoyé par la fonction
structure
, vous pouvez constater que les règles css utilisent apparemment deux accolades. Pouvez-vous expliquer pourquoi?
Réponse
Avec une simple accolade, la méthode python format
chercherait à interpréter ce qu'il y a à l'intérieur de
l'accolade.
La double accolade annule cette interprétation par la méthode format
et dans le fichier html produit, vous
pouvez vérifier que les règles css ne font intervenir qu'une seule accolade, comme le veut la syntaxe
du css. En d'autres termes dans le fichier html produit, on lit:
<style>
html{font-size: 20px;}
body{width: 80%; margin: 0 auto;}
table{border: 2px ridge orange;}
td{padding:3px;}
</style>
Les doubles accolades du code python ont disparues pour laisser place à des accolades simples.
- En ligne 34 du code
ch = ch + ligne + '\n'
, quel est le rôle du\n
? Si on le supprime (en remplaçant la ligne 34 parch = ch + ligne
), quelles différences obtiendra-t-on dans le fichier produit ?
Réponse
\n
permet d'aller à la ligne dans le fichier texte produit. Attention: dans le fichier texte (en ouvrant
avec un éditeur de texte),
par contre pour le rendu html obtenu en ouvrant le fichier avec un navigateur, aucune différence!.
Avec le \n
, les lignes de code html générées pour le tableau sont:
<tr><td>0×7</td><td>=</td><td>0</td></tr>
<tr><td>1×7</td><td>=</td><td>7</td></tr>
<tr><td>2×7</td><td>=</td><td>14</td></tr>
<tr><td>3×7</td><td>=</td><td>21</td></tr>
<tr><td>4×7</td><td>=</td><td>28</td></tr>
<tr><td>5×7</td><td>=</td><td>35</td></tr>
<tr><td>6×7</td><td>=</td><td>42</td></tr>
<tr><td>7×7</td><td>=</td><td>49</td></tr>
<tr><td>8×7</td><td>=</td><td>56</td></tr>
<tr><td>9×7</td><td>=</td><td>63</td></tr>
<tr><td>10×7</td><td>=</td><td>70</td></tr>
<tr><td>11×7</td><td>=</td><td>77</td></tr>
<tr><td>12×7</td><td>=</td><td>84</td></tr>
et sans le \n
(tout est sur une seule ligne):
<tr><td>0×7</td><td>=</td><td>0</td></tr><tr><td>1×7</td><td>=</td><td>7</td></tr><tr><td>2×7</td><td>=</td><td>14</td></tr><tr><td>3×7</td><td>=</td><td>21</td></tr><tr><td>4×7</td><td>=</td><td>28</td></tr><tr><td>5×7</td><td>=</td><td>35</td></tr><tr><td>6×7</td><td>=</td><td>42</td></tr><tr><td>7×7</td><td>=</td><td>49</td></tr><tr><td>8×7</td><td>=</td><td>56</td></tr><tr><td>9×7</td><td>=</td><td>63</td></tr><tr><td>10×7</td><td>=</td><td>70</td></tr><tr><td>11×7</td><td>=</td><td>77</td></tr><tr><td>12×7</td><td>=</td><td>84</td></tr>
Une version plus complète
def structure(entier, deroulement):
return """
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title> somme </title>
<style>
html{{font-size: 18px;}}
body{{margin: 2rem auto; width: 80%;}}
</style>
</head>
<body>
<p>Pour calculer la somme des entiers de 1 à n, on utilise la fonction python suivante: </p>
<pre>
<code>
def somme(n):
s = 0
for k in range(1, n+1):
s = s + k
return s
</code>
</pre>
<p>Le détail du déroulement avec l'entier {}: </p>
{}
</body>
</html>
""".format(entier, deroulement)
def somme(n):
"""
n -- entier > 0
"""
s = 0
somme_chaine = '0'
ch = "<code>s = 0</code> : la variable s contient 0.<br><br>"
for k in range(1, n+1):
s = s + k
somme_chaine = somme_chaine + '+' + str(k)
ligne = "La variable k a pour valeur {}.<br>".format(k)
ligne += "<code>s = s+k</code> : la variable s contient la somme {}, soit {}.<br><br>".format(somme_chaine, s)
ch = ch + ligne + '\n'
return ch
def creeFichier(nom, chaine):
"""
nom -- chaîne de caractères, nom d'un fichier à créer
chaine -- chaîne de caractères, chaîne à inscrire dans le fichier à créer
"""
# on crée un fichier html qui sera nommé nom:
with open(nom + '.html', 'w') as f:
# on écrit la chaine dans ce fichier:
print(chaine, file=f)
n = 9
creeFichier('somme' + str(n), structure(n, somme(n)))
Exercice 2☘
Dans cet exercice, on reprend une partie du code précédent pour afficher dans une page html le détail de fonctionnement d'un algorithme de calcul de la somme des n premiers entiers naturels.
def structure(v):
return """
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title> somme </title>
<style>
html{{font-size: 18px;}}
body{{margin: 2rem auto; width: 80%;}}
</style>
</head>
<body>
{}
</body>
</html>
""".format(v)
def somme(n):
"""
n -- entier > 0
"""
s = 0
somme_chaine = '0'
ch = ''
for k in range(1, n+1):
s = s + k
somme_chaine = somme_chaine + '+' + str(k)
ligne = "La variable s contient la somme {}, soit {}.<br>".format(somme_chaine, s)
ch = ch + ligne + '\n'
return ch
def creeFichier(nom, chaine):
"""
nom -- chaîne de caractères, nom d'un fichier à créer
chaine -- chaîne de caractères, chaîne à inscrire dans le fichier à créer
"""
# on crée un fichier html qui sera nommé nom:
with open(nom + '.html', 'w') as f:
# on écrit la chaine dans ce fichier:
print(chaine, file=f)
creeFichier('somme9', structure(somme(9)))
- Testez ce fichier.
- Modifiez le pour proposer de façon analogue le détail de fonctionnement d'une fonction calculant le produit des n premiers entiers naturels non nuls.
Un code possible
def structure(v):
return """
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title> produit </title>
<style>
html{{font-size: 18px;}}
body{{margin: 2rem auto; width: 80%;}}
</style>
</head>
<body>
{}
</body>
</html>
""".format(v)
def produit(n):
"""
n -- entier > 1
"""
p = 1
produit_chaine = '1'
ch = ''
for k in range(2, n+1):
p = p * k
produit_chaine = produit_chaine + '×' + str(k)
ligne = "La variable p contient le produit {}, soit {}.<br>".format(produit_chaine, p)
ch = ch + ligne + '\n'
return ch
def creeFichier(nom, chaine):
"""
nom -- chaîne de caractères, nom d'un fichier à créer
chaine -- chaîne de caractères, chaîne à inscrire dans le fichier à créer
"""
# on crée un fichier html qui sera nommé nom:
with open(nom + '.html', 'w') as f:
# on écrit la chaine dans ce fichier:
print(chaine, file=f)
creeFichier('produit', structure(produit(12)))