Corrigé Sujet N°13
- Étude Climatique par Ballon Sonde -
Vous pouvez télécharger les éléments suivants en cliquant sur les boutons associés :
Question 1
En utilisant la fonction
recupere_donnees_fichier_csv, écrire la ou les lignes de code qui récupèrent les données relevées par le ballon sonde dans 4 listes différentes : altitudes, temperatures, longitudes et latitudes.
Correction : La fonction
recupere_donnees_fichier_csv retourne un tuple de 4 listes. On utilise le déballage de tuple (unpacking) pour les récupérer directement dans 4 variables distinctes en une seule ligne.
# QUESTION 1 : récupération des données
altitudes, temperatures, longitudes, latitudes = recupere_donnees_fichier_csv("releves_ballon_sonde.csv")
# Vérification rapide
print(f"Nombre de relevés : {len(altitudes)}")
print(f"Première altitude : {altitudes[0]} m")
print(f"Première température : {temperatures[0]} K")
Question 2
Écrire en Python une fonction
conversion_K_en_C qui prend en paramètre une liste de températures en kelvins et retourne cette même liste convertie en degrés Celsius, arrondie à 1 chiffre après la virgule. Écrire une ligne de test.
Rappel : La conversion est T(°C) = T(K) − 273,15. On utilise
round(valeur, 1) pour arrondir à une décimale.
Correction simple : On parcourt la liste avec une boucle
for et on construit une nouvelle liste avec les valeurs converties.
def conversion_K_en_C(liste_temperatures):
"""Convertit une liste de températures de Kelvin en Celsius, arrondie à 1 décimale."""
temperatures_C = []
for t in liste_temperatures:
temperatures_C.append(round(t - 273.15, 1))
return temperatures_C
# Test
print(conversion_K_en_C([288.15])) # >> [15.0]
print(conversion_K_en_C([273.15, 0, 373.15])) # >> [0.0, -273.1, 100.0]
Correction avancée : On peut écrire la même fonction de façon plus concise avec une compréhension de liste.
def conversion_K_en_C(liste_temperatures):
"""Version concise avec compréhension de liste."""
return [round(t - 273.15, 1) for t in liste_temperatures]
# Application sur les données réelles
temperatures_C = conversion_K_en_C(temperatures)
print(temperatures_C[:5])
# >> [15.0, 13.7, 11.7, 7.9, 3.4]
Question 3
Proposer une écriture de la fonction
altitude_la_plus_froide qui prend en paramètres une liste d'altitudes et une liste de températures en °C, et renvoie un tuple (temperature_min, [liste_altitudes_correspondantes]).
Correction simple : On commence par trouver la température minimale avec
min(), puis on parcourt la liste pour collecter toutes les altitudes associées à cette température.
def altitude_la_plus_froide(liste_altitudes, liste_temperatures):
"""
Renvoie un tuple (temp_min, [altitudes correspondantes]).
Gère le cas où plusieurs altitudes partagent la même température minimale.
"""
temp_min = min(liste_temperatures)
altitudes_froides = []
for i in range(len(liste_temperatures)):
if liste_temperatures[i] == temp_min:
altitudes_froides.append(liste_altitudes[i])
return (temp_min, altitudes_froides)
# Tests de l'énoncé
print(altitude_la_plus_froide([7000, 10125, 13896, 14211], [-35.2, -52.1, -57.4, -57.4]))
# >> (-57.4, [13896, 14211])
print(altitude_la_plus_froide([6000, 7250, 11542, 15214, 17300], [-33.7, -45, -53, -58.5, -60.1]))
# >> (-60.1, [17300])
Correction avancée : On peut également utiliser une compréhension de liste pour construire
altitudes_froides de façon plus concise.
def altitude_la_plus_froide(liste_altitudes, liste_temperatures):
"""Version avancée avec compréhension de liste."""
temp_min = min(liste_temperatures)
altitudes_froides = [
liste_altitudes[i]
for i in range(len(liste_temperatures))
if liste_temperatures[i] == temp_min
]
return (temp_min, altitudes_froides)
# Application sur les données réelles
temperatures_C = conversion_K_en_C(temperatures)
print(altitude_la_plus_froide(altitudes, temperatures_C))
Question 4
Observer le corps de la fonction
genere_kml, puis, à l'aide d'une assertion, insérer une ligne de code qui garantit que les deux listes liste_longitudes et liste_latitudes sont de même longueur.
Correction : Une assertion (
assert) permet de vérifier une condition en cours d'exécution. Si la condition est fausse, Python lève une AssertionError avec le message précisé. Elle doit être placée en début de fonction, avant la boucle de traitement.
def genere_kml(liste_longitudes, liste_latitudes):
# QUESTION 4 : assertion sur la cohérence des listes
assert len(liste_longitudes) == len(liste_latitudes), \
"Les deux listes doivent avoir la même longueur"
fichier_kml = open('ballon sonde.kml', 'w')
# ... suite du code ...
Question 5
Écrire une ligne de code qui appelle la fonction
genere_kml avec les deux listes de longitudes et latitudes obtenues à la question 1, puis ouvrir le fichier KML généré.
Correction : On appelle simplement
genere_kml en passant les deux listes récupérées à la question 1. Le fichier ballon sonde.kml est créé dans le même répertoire que le script Python.
# QUESTION 5 : génération du fichier KML
genere_kml(longitudes, latitudes)
# Le fichier "ballon sonde.kml" est maintenant créé dans le répertoire courant.
# Il peut être ouvert avec Google Earth, QGIS, ou tout logiciel compatible KML.
Question 6
Le fichier KML généré pose des problèmes de compatibilité avec certains logiciels : la balise
</kml> est absente en fin de fichier. Proposer une amélioration du code pour corriger ce problème.
Identification du problème : Dans la version originale de
genere_kml, la variable bas_fichier contient uniquement '</Document>\n'. La balise de fermeture racine </kml> est oubliée. Le fichier KML n'est donc pas valide au sens XML et certains parseurs refusent de le charger.
Correction : Il suffit d'ajouter
'</kml>\n' à la variable bas_fichier avant l'écriture dans le fichier.
def genere_kml(liste_longitudes, liste_latitudes):
assert len(liste_longitudes) == len(liste_latitudes), \
"Les deux listes doivent avoir la même longueur"
fichier_kml = open('ballon sonde.kml', 'w')
entete_fichier = '\n'
entete_fichier += '\n'
entete_fichier += '\n'
entete_fichier += 'Trajectoire ballon sonde \n'
fichier_kml.write(entete_fichier)
for i in range(len(liste_longitudes)):
corps_fichier = '\n'
corps_fichier += f'Point {i} \n'
corps_fichier += '\n'
corps_fichier += f'{liste_longitudes[i]},{liste_latitudes[i]} \n'
corps_fichier += ' \n'
corps_fichier += ' \n'
fichier_kml.write(corps_fichier)
bas_fichier = ' \n'
bas_fichier += ' \n' # CORRECTION : balise de fermeture racine ajoutée
fichier_kml.write(bas_fichier)
fichier_kml.close()
Bonne pratique : Pour éviter ce type d'oubli, on peut aussi utiliser un gestionnaire de contexte (
with open(...) as f:), qui garantit la fermeture du fichier même en cas d'erreur, et structurer le contenu KML de façon à rendre les balises ouvrantes/fermantes visiblement symétriques dans le code.
© 2026 - Clément Legoubé