58 lines
3.1 KiB
Python
58 lines
3.1 KiB
Python
"""Table des départements français et résolution depuis un code postal."""
|
|
|
|
DEPARTEMENTS = {
|
|
"01": "Ain", "02": "Aisne", "03": "Allier", "04": "Alpes-de-Haute-Provence",
|
|
"05": "Hautes-Alpes", "06": "Alpes-Maritimes", "07": "Ardèche", "08": "Ardennes",
|
|
"09": "Ariège", "10": "Aube", "11": "Aude", "12": "Aveyron",
|
|
"13": "Bouches-du-Rhône", "14": "Calvados", "15": "Cantal", "16": "Charente",
|
|
"17": "Charente-Maritime", "18": "Cher", "19": "Corrèze",
|
|
"2A": "Corse-du-Sud", "2B": "Haute-Corse",
|
|
"21": "Côte-d'Or", "22": "Côtes-d'Armor", "23": "Creuse", "24": "Dordogne",
|
|
"25": "Doubs", "26": "Drôme", "27": "Eure", "28": "Eure-et-Loir",
|
|
"29": "Finistère", "30": "Gard", "31": "Haute-Garonne", "32": "Gers",
|
|
"33": "Gironde", "34": "Hérault", "35": "Ille-et-Vilaine", "36": "Indre",
|
|
"37": "Indre-et-Loire", "38": "Isère", "39": "Jura", "40": "Landes",
|
|
"41": "Loir-et-Cher", "42": "Loire", "43": "Haute-Loire", "44": "Loire-Atlantique",
|
|
"45": "Loiret", "46": "Lot", "47": "Lot-et-Garonne", "48": "Lozère",
|
|
"49": "Maine-et-Loire", "50": "Manche", "51": "Marne", "52": "Haute-Marne",
|
|
"53": "Mayenne", "54": "Meurthe-et-Moselle", "55": "Meuse", "56": "Morbihan",
|
|
"57": "Moselle", "58": "Nièvre", "59": "Nord", "60": "Oise",
|
|
"61": "Orne", "62": "Pas-de-Calais", "63": "Puy-de-Dôme",
|
|
"64": "Pyrénées-Atlantiques", "65": "Hautes-Pyrénées", "66": "Pyrénées-Orientales",
|
|
"67": "Bas-Rhin", "68": "Haut-Rhin", "69": "Rhône", "70": "Haute-Saône",
|
|
"71": "Saône-et-Loire", "72": "Sarthe", "73": "Savoie", "74": "Haute-Savoie",
|
|
"75": "Paris", "76": "Seine-Maritime", "77": "Seine-et-Marne", "78": "Yvelines",
|
|
"79": "Deux-Sèvres", "80": "Somme", "81": "Tarn", "82": "Tarn-et-Garonne",
|
|
"83": "Var", "84": "Vaucluse", "85": "Vendée", "86": "Vienne",
|
|
"87": "Haute-Vienne", "88": "Vosges", "89": "Yonne", "90": "Territoire de Belfort",
|
|
"91": "Essonne", "92": "Hauts-de-Seine", "93": "Seine-Saint-Denis",
|
|
"94": "Val-de-Marne", "95": "Val-d'Oise",
|
|
"971": "Guadeloupe", "972": "Martinique", "973": "Guyane",
|
|
"974": "La Réunion", "976": "Mayotte",
|
|
}
|
|
|
|
|
|
def departement_depuis_cp(cp):
|
|
"""Retourne « NN - Nom » depuis un code postal à 5 chiffres, ou ""."""
|
|
cp = (cp or "").strip()
|
|
if len(cp) != 5 or not cp.isdigit():
|
|
return ""
|
|
if cp.startswith("97"):
|
|
cle = cp[:3]
|
|
elif cp.startswith("20"):
|
|
# Corse : 20000-20199 → Corse-du-Sud, 20200-20699 → Haute-Corse (approximation usuelle)
|
|
cle = "2A" if int(cp) < 20200 else "2B"
|
|
else:
|
|
cle = cp[:2]
|
|
nom = DEPARTEMENTS.get(cle)
|
|
return f"{cle} - {nom}" if nom else ""
|
|
|
|
|
|
if __name__ == "__main__":
|
|
for cp, attendu in [("29200", "29 - Finistère"), ("20090", "2A - Corse-du-Sud"),
|
|
("20600", "2B - Haute-Corse"), ("97400", "974 - La Réunion"),
|
|
("75011", "75 - Paris"), ("00000", ""), ("abc", "")]:
|
|
resultat = departement_depuis_cp(cp)
|
|
statut = "OK" if resultat == attendu else f"ECHEC (attendu {attendu!r})"
|
|
print(f"{cp} -> {resultat!r} {statut}")
|