<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1A.2 - Modules, fichiers, expressions régulières
Le langage Python est défini par un ensemble de règle, une grammaire. Seul, il n'est bon qu'à faire des calculs. Les modules sont des collections de fonctionnalités pour interagir avec des capteurs ou des écrans ou pour faire des calculs plus rapides ou plus complexes.
Step1:  Fichiers
Les fichiers permettent deux usages principaux 
Step2:  Le même programme mais écrit avec une écriture condensée 
Step3:  On regare les premières lignes du fichier mat2.txt 
Step4:  Lecture
Step5:  On retrouve les mêmes informations à ceci près qu'il ne faut pas oublier de convertir les nombres initiaux en float.
Step6:  Voilà qui est mieux. Le module os.path propose différentes fonctions pour manipuler les noms de fichiers. Le module os propose différentes fonctions pour manipuler les fichiers 
Step7:  with
De façon pragmatique, l'instruction with permet d'écrire un code plus court d'une instruction 
Step8:  L'instruction close ferme le fichier. A l'ouverture, le fichier est réservé par le programme Python, aucune autre application ne peut écrire dans le même fichier. Après l'instruction close, une autre application pour le supprimer, le modifier. Avec le mot clé with, la méthode close est implicitement appelée.
à quoi ça sert ?
On écrit très rarement un fichier texte. Ce format est le seul reconnu par toutes les applications. Tous les logiciels, tous les langages proposent des fonctionnalités qui exportent les données dans un format texte. Dans certaines circonstances, les outils standards ne fonctionnent pas - trop grops volumes de données, problème d'encoding, caractère inattendu -. Il faut se débrouiller.
Exercice 1 
Step9:  Exercice 2 
Step11:  La cellule suivante vous permet d'enregistrer le contenu de la cellule précédente dans un fichier appelée monmodule.py.
Step12:  Le second fichier 
Step13:  Note 
Step14:  Pour retirer le module de la mémoire, il faut l'enlever de sys.modules avec l'instruction del sys.modules['monmodule']. Python aura l'impression que le module monmodule.py est nouveau et il l'importera à nouveau.
Exercice 4 
Step16:  La documentation pour les expressions régulières est ici 
<ASSISTANT_TASK:>
Python Code:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Explanation: 1A.2 - Modules, fichiers, expressions régulières
Le langage Python est défini par un ensemble de règle, une grammaire. Seul, il n'est bon qu'à faire des calculs. Les modules sont des collections de fonctionnalités pour interagir avec des capteurs ou des écrans ou pour faire des calculs plus rapides ou plus complexes.
End of explanation
mat = [[1.0, 0.0],[0.0,1.0] ]                    # matrice de type liste de listes
with open ("mat.txt", "w") as f :                # création d'un fichier en mode écriture
    for i in range (0,len (mat)) :               # 
        for j in range (0, len (mat [i])) :      # 
            s = str (mat [i][j])                 # conversion en chaîne de caractères
            f.write (s + "\t")                   #
        f.write ("\n")                           # 
        
# on vérifie que le fichier existe : 
import os
print([ _ for _ in os.listdir(".") if "mat" in _ ] )
# la ligne précédente utilise le symbole _ : c'est une variable 
# le caractère _ est une lettre comme une autre
# on pourrait écrire :
# print([ fichier for fichier in os.listdir(".") if "mat" in fichier ] )
# on utilise cette convention pour dire que cette variable n'a pas vocation à rester
Explanation: Fichiers
Les fichiers permettent deux usages principaux :
récupérer des données d'une exécution du programme à l'autre (lorsque le programme s'arrête, toutes les variables sont perdues)
échanger des informations avec d'autres programmes (Excel par exemple).
Le format le plus souvent utilisé est le fichier plat, texte, txt, csv, tsv. C'est un fichier qui contient une information structurée sous forme de matrice, en ligne et colonne car c'est comme que les informations numériques se présentent le plus souvent. Un fichier est une longue séquence de caractères. Il a fallu choisir une convention pour dire que deux ensembles de caractères ne font pas partie de la même colonne ou de la même ligne. La convention la plus répandue est :
\t : séparateur de colonnes
\n : séparateur de lignes
Le caractère \ indique au langage python que le caractère qui suit fait partie d'un code. Vous trouverez la liste des codes : String and Bytes literals.
Aparté : aujourd'hui, lire et écrire des fichiers est tellement fréquent qu'il existe des outils qui font ça dans une grande variété de formats. Vous découvrirez cela lors de la séance 10. Il est utile pourtant de le faire au moins une fois soi-même pour comprendre la logique des outils et pour ne pas être bloqué dans les cas non prévus.
Ecrire et lire des fichiers est beaucoup plus long que de jouer avec des variables. Ecrire signifie qu'on enregistre les données sur le disque dur : elles passent du programme au disque dur (elles deviennent permanentes). Elles font le chemin inverse lors de la lecture.
Ecriture
Il est important de retenir qu'un fichier texte ne peut recevoir que des chaînes de caractères.
End of explanation
mat = [[1.0, 0.0],[0.0,1.0] ]             # matrice de type liste de listes
with open ("mat.txt", "w") as f :        # création d'un fichier
    s = '\n'.join ( '\t'.join( str(x) for x in row  ) for row in mat )
    f.write ( s )
    
# on vérifie que le fichier existe : 
print([ _ for _ in os.listdir(".") if "mat" in _ ] )    
Explanation: Le même programme mais écrit avec une écriture condensée :
End of explanation
import pyensae
%load_ext pyensae
%head mat.txt
Explanation: On regare les premières lignes du fichier mat2.txt :
End of explanation
with open ("mat.txt", "r") as f : # ouverture d'un fichier
    mat = [ row.strip(' \n').split('\t') for row in f.readlines() ]
print(mat)
Explanation: Lecture
End of explanation
with open ("mat.txt", "r") as f :                # ouverture d'un fichier
    mat = [ [ float(x) for x in row.strip(' \n').split('\t') ] for row in f.readlines() ]
print(mat)
Explanation: On retrouve les mêmes informations à ceci près qu'il ne faut pas oublier de convertir les nombres initiaux en float.
End of explanation
import os
for f in os.listdir('.'):
    print (f)
Explanation: Voilà qui est mieux. Le module os.path propose différentes fonctions pour manipuler les noms de fichiers. Le module os propose différentes fonctions pour manipuler les fichiers :
End of explanation
with open("exemple_fichier.txt", "w") as f:
    f.write("something")
f = open("exemple_fichier.txt", "w")
f.write("something")
f.close()
Explanation: with
De façon pragmatique, l'instruction with permet d'écrire un code plus court d'une instruction : close. Les deux bouts de code suivant sont équivalents :
End of explanation
import math
print (math.cos(1))
from math import cos
print (cos(1))
from math import *    # cette syntaxe est déconseillée car il est possible qu'une fonction
print (cos(1))        # porte le même nom qu'une des vôtres
Explanation: L'instruction close ferme le fichier. A l'ouverture, le fichier est réservé par le programme Python, aucune autre application ne peut écrire dans le même fichier. Après l'instruction close, une autre application pour le supprimer, le modifier. Avec le mot clé with, la méthode close est implicitement appelée.
à quoi ça sert ?
On écrit très rarement un fichier texte. Ce format est le seul reconnu par toutes les applications. Tous les logiciels, tous les langages proposent des fonctionnalités qui exportent les données dans un format texte. Dans certaines circonstances, les outils standards ne fonctionnent pas - trop grops volumes de données, problème d'encoding, caractère inattendu -. Il faut se débrouiller.
Exercice 1 : Excel $\rightarrow$ Python $\rightarrow$ Excel
Il faut télécharger le fichier seance4_excel.xlsx qui contient une table de trois colonnes. Il faut :
enregistrer le fichier au format texte,
le lire sous python
créer une matrice carrée 3x3 où chaque valeur est dans sa case (X,Y),
enregistrer le résultat sous format texte,
le récupérer sous Excel.    
Autres formats de fichiers
Les fichiers texte sont les plus simples à manipuler mais il existe d'autres formats classiques~:
html : les pages web
xml : données structurées
[zip](http://fr.wikipedia.org/wiki/ZIP_(format_de_fichier), gz : données compressées
wav, mp3, ogg : musique
mp4, Vorbis : vidéo
...
Modules
Les modules sont des extensions du langages. Python ne sait quasiment rien faire seul mais il bénéficie de nombreuses extensions. On distingue souvent les extensions présentes lors de l'installation du langage (le module math) des extensions externes qu'il faut soi-même installer (numpy). Deux liens :
modules officiels
modules externes
Le premier réflexe est toujours de regarder si un module ne pourrait pas vous être utile avant de commencer à programmer. Pour utiliser une fonction d'un module, on utilise l'une des syntaxes suivantes :
End of explanation
# fichier monmodule.py
import math
def fonction_cos_sequence(seq) :
    return [ math.cos(x) for x in seq ]
if __name__ == "__main__" :
    print ("ce message n'apparaît que si ce programme est le point d'entrée")
Explanation: Exercice 2 : trouver un module (1)
Aller à la page modules officiels (ou utiliser un moteur de recherche) pour trouver un module permettant de générer des nombres aléatoires. Créer une liste de nombres aléatoires selon une loi uniforme puis faire une permutation aléatoire de cette séquence.
Exercice 3 : trouver un module (2)
Trouver un module qui vous permette de calculer la différence entre deux dates puis déterminer le jour de la semaine où vous êtes nés.
Module qu'on crée soi-même
Il est possible de répartir son programme en plusieurs fichiers. Par exemple, un premier fichier monmodule.py qui contient une fonction :
End of explanation
code = 
# -*- coding: utf-8 -*-
import math
def fonction_cos_sequence(seq) :
    return [ math.cos(x) for x in seq ]        
if __name__ == "__main__" :
    print ("ce message n'apparaît que si ce programme est le point d'entrée")
with open("monmodule.py", "w", encoding="utf8") as f :
    f.write(code)
Explanation: La cellule suivante vous permet d'enregistrer le contenu de la cellule précédente dans un fichier appelée monmodule.py.
End of explanation
import monmodule
print ( monmodule.fonction_cos_sequence ( [ 1, 2, 3 ] ) )
Explanation: Le second fichier :
End of explanation
import sys
list(sorted(sys.modules))[:10]
Explanation: Note : Si le fichier monmodule.py est modifié, python ne recharge pas automatiquement le module si celui-ci a déjà été chargé. On peut voir la liste des modules en mémoire dans la variable sys.modules :
End of explanation
import pyensae.datasource
discours = pyensae.datasource.download_data('voeux.zip', website = 'xd')
Explanation: Pour retirer le module de la mémoire, il faut l'enlever de sys.modules avec l'instruction del sys.modules['monmodule']. Python aura l'impression que le module monmodule.py est nouveau et il l'importera à nouveau.
Exercice 4 : son propre module
Que se passe-t-il si vous remplacez if __name__ == "__main__":  par if True :, ce qui équivaut à retirer la ligne if __name__ == "__main__": ?
Expressions régulières
Pour la suite de la séance, on utilise comme préambule les instructions suivantes :
End of explanation
import re   # les expressions régulières sont accessibles via le module re
expression = re.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}")
texte = Je suis né le 28/12/1903 et je suis mort le 08/02/1957. Ma seconde femme est morte le 10/11/63.
cherche = expression.findall(texte)
print(cherche)
Explanation: La documentation pour les expressions régulières est ici : regular expressions. Elles permettent de rechercher des motifs dans un texte :
4 chiffres / 2 chiffres / 2 chiffres correspond au motif des dates, avec une expression régulière, il s'écrit : [0-9]{4}/[0-9]{2}/[0-9]{2}
la lettre a répété entre 2 et 10 fois est un autre motif, il s'écrit : a{2,10}.
End of explanation
<END_TASK>