001_02 — Génération du modèle Excel
Cahier des charges⚓
1
# CDC 001_02Code Python⚓
1
# TD_EDC_01_001_02.py2
# Résumé : chemins dynamiques (dossier parent -> *_do, *_md), suppression du fichier3
# Excel existant, régénération avec en-têtes/formules, ouverture dans Excel.4
# Points clés : pathlib pour les chemins, suppression prudente, xlsxwriter pour l'export,5
# subprocess pour lancer Excel.6
# Génère un classeur Excel basé sur le nom du script et l'ouvre dans Excel.7
from pathlib import Path
8
import subprocess
9
import xlsxwriter
10
11
12
def build_paths() -> tuple[Path, Path]:
13
"""Calcule les chemins (xlsx, md) à partir du nom du script.14
15
Les dossiers de sortie sont dérivés du nom du dossier parent (ex: 001 -> 001_do, 001_md).16
"""17
script = Path(__file__).resolve()
18
root = script.parent.parent # folder containing 001 and its siblings
19
stem = script.stem
20
base_dir_name = script.parent.name # e.g., "001"
21
xlsx_dir = root / f"{base_dir_name}_do"
22
md_dir = root / f"{base_dir_name}_md"
23
xlsx_path = (xlsx_dir / f"{stem}.xlsx").resolve()
24
md_path = (md_dir / f"{stem}.md").resolve()
25
xlsx_path.parent.mkdir(parents=True, exist_ok=True)
26
md_path.parent.mkdir(parents=True, exist_ok=True)
27
return xlsx_path, md_path
28
29
30
def delete_if_exists(path: Path) -> None:
31
"""Supprime le fichier s'il existe (silencieux s'il est absent)."""32
if path.exists():
33
path.unlink()
34
35
36
def create_workbook(xlsx_path: Path, n: int = 9) -> None:
37
"""Crée le classeur du modèle de survie avec en-têtes et formules."""38
workbook = xlsxwriter.Workbook(str(xlsx_path))
39
sheet = workbook.add_worksheet("modele_N_nRep")
40
41
sheet.write_row(0, 0, ["Rang i", "ttf i", "dN(i)", "N(i)"])
42
43
for i in range(n + 1):
44
row = i + 1 # start writing on Excel line 2
45
sheet.write(row, 0, i)
46
sheet.write(row, 2, 1) # placeholder dN(i) value
47
48
if i == 0:
49
sheet.write(row, 3, n)
50
else:51
prev_excel_row = row # Excel rows are 1-based
52
curr_excel_row = row + 1
53
sheet.write_formula(row, 3, f"=D{prev_excel_row}-C{curr_excel_row}")
54
55
workbook.close()
56
57
58
def open_in_excel(xlsx_path: Path) -> None:
59
"""Ouvre le classeur généré dans Excel (Windows)."""60
subprocess.Popen(["start", "excel", str(xlsx_path)], shell=True)
61
62
63
def main() -> None:
64
"""Pipeline : calcul des chemins, suppression éventuelle, création et ouverture."""65
xlsx_path, _ = build_paths()
66
delete_if_exists(xlsx_path)
67
create_workbook(xlsx_path, n=9)
68
open_in_excel(xlsx_path)
69
70
71
if __name__ == "__main__":
72
main()Documentation⚓
1
# 001_01 — Génération du modèle Excel2
3
## Objectifs4
- Générer un classeur `modele_N_nRep` à partir du script Python.
5
- Supprimer automatiquement l'ancien fichier Excel avant régénération.6
- Placer le classeur dans `001_do` avec le même nom que le script (`001_01.xlsx`).
7
- Ouvrir le fichier dans Excel après création (Windows).8
9
## Fonctionnement10
1. Calcule les chemins de sortie à partir du nom du script.11
2. Supprime le fichier Excel s'il existe déjà.12
3. Crée un classeur avec les en-têtes `Rang i`, `ttf i`, `dN(i)`, `N(i)`.
13
4. Renseigne les lignes 0..N et insère une formule de décrément sur la colonne `N(i)`.
14
5. Lance Excel sur le fichier généré.15
16
## Points techniques17
- **Bibliothèque** : `xlsxwriter` pour écrire le fichier `.xlsx`.
18
- **Chemins** : construits via `pathlib` (dossiers `001_do` et `001_md` créés au besoin).
19
- **Sécurité** : suppression préalable via `Path.unlink()` si le fichier existe.
20
- **Formules** : `D(row) = D(row-1) - C(row)` pour suivre le nombre de survivants.
21
22
## Utilisation23
```bash24
python 001/001_01.py25
```26
Le fichier généré : `001_do/001_01.xlsx`.27