|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | +"""Script pour récupérer les données d'un fichier log culvert |
| 3 | +
|
| 4 | +Description détaillée: |
| 5 | +Le script analyse chaque ligne du fichier à la recherche des données sur |
| 6 | +les culverts décrits pas le fichier. Le script affiche le nombre de culverts |
| 7 | +trouvés dans le fichier, puis exporte les données au format csv. |
| 8 | +
|
| 9 | +Utilisation: |
| 10 | +1. Modifier la variable CULVERT_FILE_PATH pour qu'elle indique le chemin vers |
| 11 | + le fichier log culvert. (r"path\to\file" si le chemin contient des |
| 12 | + backslashs) |
| 13 | +2. Exécuter le script avec `python culvert_logparser.py` |
| 14 | +
|
| 15 | +Historique: |
| 16 | +- ML (10/09/2019): Création du script |
| 17 | +""" |
| 18 | +# Les imports se placent par convention tout au début du fichier. |
| 19 | +# On importe pandas de la manière conventionnelle |
| 20 | +import pandas as pd |
| 21 | + |
| 22 | +############################################################################### |
| 23 | +############################ Données d'entrée ################################# |
| 24 | +############################################################################### |
| 25 | +CULVERT_FILE_PATH ="culvert_logfile.txt" |
| 26 | +############################################################################### |
| 27 | + |
| 28 | +# On déclare un dictionnaire des paramètres qu'on |
| 29 | +# va stocker. Chaque "key" du dictionnaire contient |
| 30 | +# une liste vide. On a pour objectif d'ajouter les |
| 31 | +# informations qu'on trouve dans le fichier à |
| 32 | +# chacune de ces listes. |
| 33 | +culvert_data = { |
| 34 | + "branch": [], |
| 35 | + "name": [], |
| 36 | + "type": [], |
| 37 | + "diameter": [], |
| 38 | + "length": [], |
| 39 | + "manning": [], |
| 40 | + "upstream_chainage": [], |
| 41 | + "upstream_invert": [] |
| 42 | +} |
| 43 | + |
| 44 | +# On ouvre le fichier en utilisant le keyword 'with' |
| 45 | +# et la fonction 'open' à laquelle on passe le chemin |
| 46 | +# du fichier et l'argument "r" (read) pour signifier qu'on |
| 47 | +# souhaite uniquement lire le fichier. |
| 48 | +# Utiliser 'with' et 'open' garantie que le fichier ouvert |
| 49 | +# sera correctement fermé même si une erreur survient |
| 50 | +# lorsqu'on travaille avec le fichier ouvert. |
| 51 | +with open(CULVERT_FILE_PATH, "r") as f: |
| 52 | + # On crée un compteur qu'on va incrémenter |
| 53 | + # à chaque fois qu'on va trouver un *culvert* |
| 54 | + # dans le fichier texte. |
| 55 | + culvert_count = 0 |
| 56 | + # On itère au travers de toutes les lignes du fichier. |
| 57 | + for line in f: |
| 58 | + # line réfère maintenant à la ligne en cours de lecture. |
| 59 | + # Il s'agit d'un objet `string`. Attention, il se |
| 60 | + # termine à chaque fois par "\n" qui est un caractère |
| 61 | + # spécial représentant un saut de ligne. |
| 62 | + |
| 63 | + # On incrémente le compteur si le texte "START CULVERT" |
| 64 | + # se trouve dans la ligne en cours de lecture |
| 65 | + if "START CULVERT" in line: |
| 66 | + culvert_count += 1 |
| 67 | + |
| 68 | + # On vérifie si la ligne en cours de lecture démarre |
| 69 | + # part le texte "Culvert_branch". |
| 70 | + if line.startswith("Culvert_branch"): |
| 71 | + # Si oui, on enlève les éventuels espaces blancs |
| 72 | + # et caractères spéciaux ("\n", "\t") qui pourrait |
| 73 | + # se trouver au début et/ou à la fin --> strip() |
| 74 | + # Cette méthode retourne un nouvel objet *string* |
| 75 | + # On sépare ensuite la ligne suivant le délimiteur |
| 76 | + # " = ". --> split(" = "). Cette méthode retourne |
| 77 | + # une *list* de *strings*. Le deuxième et dernier |
| 78 | + # élément de cette *list* correspond au nom de |
| 79 | + # la branche. On y accède avec [1]. |
| 80 | + # Finalement, on enlève les apostrophes à la fin |
| 81 | + # et au début du nom de la branche --> strip("'") |
| 82 | + # Cette méthode retourne un nouvel objet *string* |
| 83 | + # auquel est associé le nom branch. |
| 84 | + branch = line.strip().split(" = ")[1].strip("'") |
| 85 | + # On ajoute le nom de la branche à la liste de la |
| 86 | + # key "branch" du dictionnaire des sorties. |
| 87 | + culvert_data["branch"].append(branch) |
| 88 | + |
| 89 | + # On vérifie si la ligne en cours de lecture démarre |
| 90 | + # part le texte "Culvert_name". |
| 91 | + if line.startswith("Culvert_name"): |
| 92 | + # On stocke dans le dictionnaire le nom du culvert |
| 93 | + # en cours de lecture. |
| 94 | + name = line.strip().split(" = ")[1].strip("'") |
| 95 | + culvert_data["name"].append(name) |
| 96 | + # On vérifie si la ligne en cours de lecture démarre |
| 97 | + # part le texte "Culvert_params". |
| 98 | + if line.startswith("Culvert_params"): |
| 99 | + # On récupère l'ensemble des paramètres dans un objet |
| 100 | + # *list* nommé params |
| 101 | + params = line.strip().split(" = ")[1].split(",") |
| 102 | + # On unpack chacun des éléments de la liste (6) |
| 103 | + # On a maintenant 6 nouveaux noms à disposition |
| 104 | + # pour référencer les paramètres du culvert |
| 105 | + t, d, l, m, uc, ui = params |
| 106 | + # On ajoute les paramètres à leur liste dans le |
| 107 | + # dictionnaire. |
| 108 | + culvert_data["type"].append(t) |
| 109 | + culvert_data["diameter"].append(d) |
| 110 | + culvert_data["length"].append(l) |
| 111 | + culvert_data["manning"].append(m) |
| 112 | + culvert_data["upstream_chainage"].append(uc) |
| 113 | + culvert_data["upstream_invert"].append(ui) |
| 114 | + |
| 115 | +# On affiche le nombre de culverts trouvés dans le fichier. |
| 116 | +print(f"{culvert_count} culverts ont été trouvés!") |
| 117 | + |
| 118 | +# Un DataFrame est créé à partir de toutes les données du dictionnaires. |
| 119 | +df = pd.DataFrame(culvert_data) |
| 120 | +# Les données extraites sont enregistrées dans un fichier csv. |
| 121 | +# index=False évite d'écrire l'index du DataFrame dans le fichier, |
| 122 | +# celui-ci n'étant pas utile ici. |
| 123 | +df.to_csv("culvert_data.csv", index=False) |
0 commit comments