... | @@ -7,6 +7,8 @@ De toutes façons, il faut savoir lire les données dans un fichier, donc c'est |
... | @@ -7,6 +7,8 @@ De toutes façons, il faut savoir lire les données dans un fichier, donc c'est |
|
|
|
|
|
Vous trouverez du code déjà écrit dans le fichier Python visu_chronique.py, avec la fonction lecteur_qj0_to_ts écrite pour lire des fichiers de débit journalier dans un des formats de la base Hydro2.
|
|
Vous trouverez du code déjà écrit dans le fichier Python visu_chronique.py, avec la fonction lecteur_qj0_to_ts écrite pour lire des fichiers de débit journalier dans un des formats de la base Hydro2.
|
|
Normalement, le code est commenté, et vous êtes invités à vous approprier ce code. N'hésitez pas à tester les instructions dans la console comme on a fait précédemment, et essayer de réécrire votre propre fonction.
|
|
Normalement, le code est commenté, et vous êtes invités à vous approprier ce code. N'hésitez pas à tester les instructions dans la console comme on a fait précédemment, et essayer de réécrire votre propre fonction.
|
|
|
|
Du code est également déjà écrit dans un [fichier sur un REPL en ligne](https://replit.com/@CPoulard/Plotting-long-time-series#main.py)
|
|
|
|
|
|
|
|
|
|
Il existe des méthodes performantes pour lire des fichiers structurés (colonnes nommées et lignes), notamment dans pandas et seaborn (read_csv). Ici, le fichier à un format qui se prête moyennement bien aux lectures en bloc, et on va donc travailler à l'ancienne.
|
|
Il existe des méthodes performantes pour lire des fichiers structurés (colonnes nommées et lignes), notamment dans pandas et seaborn (read_csv). Ici, le fichier à un format qui se prête moyennement bien aux lectures en bloc, et on va donc travailler à l'ancienne.
|
|
Au passage, on va manipuler plusieurs notions utiles de Python. .
|
|
Au passage, on va manipuler plusieurs notions utiles de Python. .
|
... | @@ -42,25 +44,29 @@ else: |
... | @@ -42,25 +44,29 @@ else: |
|
On peut écrire une boucle **while** qui repose la question tant que le chemin n'est pas valide.
|
|
On peut écrire une boucle **while** qui repose la question tant que le chemin n'est pas valide.
|
|
|
|
|
|
**3) j'utilise une fonction de Tkinter**
|
|
**3) j'utilise une fonction de Tkinter**
|
|
|
|
C'est cette option qui est choisie dans le REPL en ligne.
|
|
``` python
|
|
``` python
|
|
from tkinter.filedialog import askopenfilename
|
|
from tkinter.filedialog import askopenfilename
|
|
chemin_complet= askopenfilename() # ouverture d'une fenêtre explorateur
|
|
chemin_complet= askopenfilename() # ouverture d'une fenêtre explorateur
|
|
```
|
|
```
|
|
C'est une utilisation "vite fait sur le gaz" d'une fonnctionnalité qui s'utilise normalement avec une interface graphique. En l'absence de cette interface, Tkinter va se débrouiller et ouvrir quand même une interface dans un coin, qu'il faudra refermer.
|
|
C'est une utilisation "vite fait sur le gaz" d'une fonctionnalité qui s'utilise normalement avec une interface graphique. En l'absence de cette interface, Tkinter va se débrouiller et ouvrir quand même une interface dans un coin, qu'il faudra refermer.
|
|
On verra si nécessaire comment définir proprement une interface, mais cela sort du cadre de ce premier atelier.
|
|
On verra si nécessaire comment définir proprement une interface, mais cela sort du cadre de ce premier atelier.
|
|
Là encore, il est utile de vérifier si le fichier existe.
|
|
Là encore, il est utile de vérifier si le fichier existe.
|
|
|
|
Il n'est pas rare d'avoir des problèmes de format ; sur le REPL.IT vous trouverez deux fichiers dont le nom commence par "B2220010" ; un seul permet de faire tourner le code correctement. Si vous les ouvrez, vous ne verrez pas de différence au premier abord. Celui qui est déposé sur le gitlab a été d'abord copié sur le site REPL, mais le code ne pouvait pas l'ouvrir... On a "truandé" en ouvrant un fichier sur le REPL puis en copiant-collant les données dedans...
|
|
|
|
Si vous avez un Mac vous pourriez être amené à pratiquer le même genre de bidouille ou bien à rechercher le format du fichier d'entrée.
|
|
|
|
|
|
|
|
|
|
#### b) Ouvrir le fichier et le lire ligne par ligne
|
|
#### b) Ouvrir le fichier et le lire ligne par ligne
|
|
|
|
|
|
Un code vous est déjà proposé.
|
|
Sur les deux supports, un code vous est déjà proposé.
|
|
Pratique recommandée pour ouvrir un fichier : "**with** open(nom_fichier, 'r') as alias_du_fichier".
|
|
Pratique recommandée pour ouvrir un fichier : "**with** open(nom_fichier, 'r') as alias_du_fichier".
|
|
|
|
|
|
:baby: Si vous débutez : retenez que cette syntaxe est fortement recommandées ; si vous utilisez une autre façon de faire vous devrez bien penser à fermer le fichier à la fin.
|
|
:baby: Si vous débutez : retenez que cette syntaxe est fortement recommandées ; si vous utilisez une autre façon de faire vous devrez bien penser à fermer le fichier à la fin.
|
|
:older_man: Si vous être plus avancé,retenez la notion de **context manager**
|
|
:older_man: Si vous être plus avancé, vous connaissez peut-être la notion de **context manager**.
|
|
=> **with** introduit un **"context manager"** qui déclenche une action définie par la méthode dunder__start__ de la classe avant la première instruction, et une dernière action définie par la dunder__end__ à la fin. Ici, l'action finale est la fermeture du fichier, ce qui garantit que le fichier se fermera à la fin du bloc d'instructions, quoi qu'il arrive. Cela rappelle les décorateurs, sauf qu'ici on peut choisir d'appeler la classe avec un context manager ou pas, alors que les décorateurs modifient définitivement la fonction (surcharge).
|
|
=> **with** introduit un **"context manager"** qui déclenche une action définie par la méthode dunder __start__ de la classe avant la première instruction, et une dernière action définie par la dunder __end__ à la fin. Ici, l'action finale est la fermeture du fichier, ce qui garantit que le fichier se fermera à la fin du bloc d'instructions, quoi qu'il arrive. Cela rappelle les décorateurs, sauf qu'ici on peut choisir d'appeler au cas par cas la classe avec un context manager ou pas, alors que les décorateurs modifient définitivement la fonction (surcharge).
|
|
On peut par exemple définir un context manager pour mesurer le temps d'exécution d'une fonction (au début : on note l'heure ; à la fin : on note l'heure et on calcule le délai).
|
|
On peut par exemple définir un context manager pour mesurer le temps d'exécution d'une fonction (au début : on note l'heure ; à la fin : on note l'heure et on calcule le délai).
|
|
|
|
|
|
Ensuite, on va lire les lignes avec alias_du_fichier.readline().
|
|
Une fois le fichier ouvert, on va lire les lignes avec alias_du_fichier.readline().
|
|
Dans le code proposé, on va d'abord lire les lignes une à une jusqu'à en trouver une qui contienne un mot-clé.
|
|
Dans le code proposé, on va d'abord lire les lignes une à une jusqu'à en trouver une qui contienne un mot-clé.
|
|
Ensuite, on lit toutes les autres grâce à une simple boucle **for ligne_lue in alias_du_fichier**, qui lira les lignes une par une jusqu'à la fin. Grâce au context manager, le fichier sera fermé proprement à la fin du bloc de code.
|
|
Ensuite, on lit toutes les autres grâce à une simple boucle **for ligne_lue in alias_du_fichier**, qui lira les lignes une par une jusqu'à la fin. Grâce au context manager, le fichier sera fermé proprement à la fin du bloc de code.
|
|
|
|
|
... | | ... | |