-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexporteur.py
More file actions
144 lines (126 loc) · 5.66 KB
/
exporteur.py
File metadata and controls
144 lines (126 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""
Module pour l'exportation des données.
"""
from os.path import abspath, isdir, join
from json import dump
from altair import Chart
from pandas import DataFrame
class Exporteur:
"""
Représente un exporteur de données pour exporter des données
vers un fichier de sortie.
Attributes:
_chemin_sortie (str): Le chemin du dossier vers lequel les données
vont être exportées.
"""
def __init__(self, chemin_sortie: str):
# Vérification du paramètre
if not isinstance(chemin_sortie, str):
raise TypeError("Le chemin de sortie doit être une chaîne de caractères.")
# Vérification du chemin
chemin_sortie_absolue = abspath(chemin_sortie)
if not isdir(chemin_sortie_absolue):
raise ExportationDossierIntrouvableException(f"Impossible d'exporter vers le "
f"dossier {chemin_sortie} ({chemin_sortie_absolue}), "
"le dossier n'existe pas.")
# Ajout du chemin
self._chemin_sortie = chemin_sortie
def export_vers_json(self, donnees: dict, nom_fichier: str) -> None:
"""
Export le dictionnaire fourni vers le ``chemin de sortie``.
Args:
donnees (dict): Le dictionnaire qui contient les données.
nom_fichier (str): Le nom du fichier JSON.
Returns:
None
Raises:
TypeError: Le paramètre ``donnees`` n'est pas un dictionnaire.
ExportationJsonException: Une erreur lors de l'écriture dans le fichier JSON.
"""
# Vérification du type des paramètres
if not isinstance(donnees, dict):
raise TypeError("Les statistiques à exporter doivent être sous une forme "
"de dictionnaire.")
if not isinstance(nom_fichier, str):
raise TypeError("Le nom du fichier doit être une chaîne de caractère.")
# Vérification du nom du fichier
if not nom_fichier.endswith(".json"):
raise ValueError("Le fichier JSON doit terminé par l'extention '.json'.")
# Exportation
chemin_fichier = join(self._chemin_sortie, nom_fichier)
try:
with open(chemin_fichier, 'w', encoding="utf-8") as fichier:
dump(donnees, fichier, indent=4)
except Exception as ex:
raise ExportationJsonException(str(ex)) from ex
def export_vers_html_camembert(self,
donnees: list,
nom_fichier: str) -> None:
"""
Export la liste fournie vers un camembert HTML vers le ``chemin de sortie``.
Args:
donnees (list): Les données du camembert. La liste doit contenir
des listes de deux éléments où le premier reprèsente le nom de cette
partie du camembert et le deuxième sa valeur.
nom_fichier (str): Le nom du fichier HTML.
Returns:
None
Raises:
TypeError: Les paramètres ne sont pas du type attendu ou la liste ``donnees``
contient un élément qui n'est pas une liste.
ValueError: Le paramètre ``nom_fichier`` ne termine pas par .html ou le paramètre
``donnees`` ne contient pas des listes de longueur 2.
ExportationCamembertHtmlException: Erreur lors de l'exportation du camembert.
"""
# Vérification du type des paramètres
if not isinstance(donnees, list):
raise TypeError("Les données de l'histogramme à exporter doit être sous une forme "
"de liste.")
if not isinstance(nom_fichier, str):
raise TypeError("Le nom du fichier doit être une chaîne de caractère.")
# Vérification du nom du fichier
if not nom_fichier.endswith(".html"):
raise ValueError("Le fichier HTML doit terminé par l'extention '.html'.")
# Récupération des axes du graphique
axe_x = []
axe_y = []
for donnee in donnees:
if not isinstance(donnee, list):
raise ValueError("La liste des données de l'histogramme à exporter ne doit "
"contenir que des listes.")
if not len(donnee) == 2:
raise ValueError("La liste des données de l'histogramme à exporter ne doit "
"contenir que des listes de deux éléments (x, y).")
axe_x.append(donnee[0])
axe_y.append(donnee[1])
axes = DataFrame({"x": axe_x, "y": axe_y})
# Exportation
try:
chemin_fichier = join(self._chemin_sortie, nom_fichier)
camembert = Chart(axes).mark_arc().encode(
theta='y:Q',
color='x:N',
tooltip=['x:N', 'y:Q']
)
camembert.save(chemin_fichier)
except Exception as ex:
raise ExportationCamembertHtmlException("Erreur lors de l'exportation "
f"du camembert {nom_fichier}.") from ex
class ExportationException(Exception):
"""
Représente une erreur lors de l'exportation de données.
"""
class ExportationJsonException(ExportationException):
"""
Représente une erreur lors de l'exportation de données vers un format JSON.
"""
class ExportationCamembertHtmlException(ExportationException):
"""
Représente une erreur lors de l'exportation de données vers un histogramme
au format HTML.
"""
class ExportationDossierIntrouvableException(ExportationException):
"""
Représente une erreur lorsque une exportation est impossible
lorsque le dossier de l'exportation n'existe pas.
"""