Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 199 minDébutant

Aide-mémoire Python

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • retrouver vite la syntaxe et les méthodes courantes ;
  • choisir le bon module de la bibliothèque standard ;
  • éviter les pièges les plus fréquents.

Cet aide-mémoire Python rassemble sur une page les commandes pour installer et lancer Python, la syntaxe de base, les méthodes des chaînes, listes et dictionnaires, la lecture des fichiers CSV et JSON, les modules de la bibliothèque standard utiles à l'administration, les expressions régulières, pytest et les pièges les plus fréquents. Chaque notion est détaillée dans son chapitre.

Installer, lancer, gérer les paquets

BesoinWindowsLinux et macOS
Installer PythonGestionnaire d'installation, puis py install 3.15sudo apt install python3 python3-venv python3-pip (Debian)
Versionpython --version, py listpython3 --version
Lancer un scriptpython script.py, py -V:3.14 script.pypython3 script.py, ou ./script.py avec un shebang
Créer un environnementpython -m venv .venvpython3 -m venv .venv
L'activer.venv\Scripts\Activate.ps1source .venv/bin/activate
Installer un paquetpython -m pip install requestsidem, environnement activé
Figer, réinstallerpython -m pip freeze > requirements.txt, python -m pip install -r requirements.txtidem
Avec uvuv init --no-package projet, uv add requests, uv run main.py, uv sync, uv run script.py (en-tête PEP 723)idem

Syntaxe de base

python
nom = "srv-ad"; taux = 87.5; actif = True; rien = None   # str, float, bool, NoneType
7 / 2   # 3.5      7 // 2   # 3      7 % 2   # 1      2 ** 10   # 1024
f"{nom:<14}{taux:6.1f} %  {taux=}"                        # f-string et formats
int("42"), float("3.5"), str(42), round(3.14159, 2)       # conversions

if taux >= 90:
    niveau = "CRITIQUE"
elif taux >= 80:
    niveau = "ALERTE"
else:
    niveau = "OK"

match code:
    case 200 | 201: sens = "succès"
    case _: sens = "autre"

for i in range(1, 11, 3): ...           # 1, 4, 7, 10
for rang, x in enumerate(liste, start=1): ...
for a, b in zip(liste1, liste2): ...
while condition: ...                     # break : sortir ; continue : tour suivant

def niveau(taux: float, alerte: float = 80) -> str:
    """Docstring : ce que fait la fonction."""
    return "ALERTE" if taux >= alerte else "OK"

if __name__ == "__main__":               # seulement quand le fichier est lancé
    main()

Chaînes, listes, tuples, dictionnaires, ensembles

StructureOpérations courantes
Chaîne ss[i], s[-1], s[a:b], len(s), s.strip(), s.split(";"), ";".join(liste), s.lower(), s.replace(a, b), s.startswith(x), x in s
Liste ll.append(x), l.insert(i, x), l.remove(x), l.pop(), l.sort(), sorted(l, key=…, reverse=True), l.copy(), sum(l), min(l), max(l)
Tuple tt[i], a, b, c = t, premier, *reste = t ; non modifiable
Dictionnaire dd[c], d.get(c, defaut), d[c] = v, del d[c], c in d, d.items(), d.keys(), d.values(), d.setdefault(c, [])
Ensemble ee.add(x), x in e, a & b, a | b, a - b, a ^ b, set() pour l'ensemble vide
Comptage, regroupementCounter(liste).most_common(3), defaultdict(list)
Compréhensions[f(x) for x in l if cond], {k: v for k, v in d.items()}, {x for x in l}, sum(1 for x in l if cond)

Fichiers texte, CSV et JSON

python
from pathlib import Path
import csv, json

p = Path("rapports") / "controle.txt"
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text("texte\n", encoding="utf-8")
with open(p, "a", encoding="utf-8") as f:              # "r" lire, "w" écraser, "a" ajouter
    f.write("ligne\n")
for fichier in sorted(Path("journaux").rglob("*.log")): ...

with open("inventaire.csv", encoding="utf-8-sig", newline="") as f:   # utf-8-sig : BOM d'Excel
    lignes = list(csv.DictReader(f, delimiter=";"))                   # liste de dictionnaires
with open("sortie.csv", "w", encoding="utf-8-sig", newline="") as f:
    w = csv.DictWriter(f, fieldnames=["nom", "ip"], delimiter=";")
    w.writeheader(); w.writerows(lignes_a_ecrire)

donnees = json.loads(Path("config.json").read_text(encoding="utf-8"))
texte = json.dumps(donnees, indent=2, ensure_ascii=False)

Exceptions et code de retour

python
try:
    valeur = int(saisie)
except ValueError as erreur:          # seulement ce qu'on sait traiter
    print("Pas un nombre :", erreur)
else:
    print("OK")                       # si aucune exception
finally:
    print("toujours exécuté")

raise ValueError(f"seuil invalide : {seuil}")
sys.exit(1)                           # 0 = succès ; message d'erreur : print(..., file=sys.stderr)

Un traceback se lit de bas en haut : le type et le message, la ligne fautive, puis le chemin des appels.

Bibliothèque standard pour l'administration

ModulePourÀ retenir
osVariables d'environnementos.environ.get("VAR", "défaut"), os.environ["SECRET"]
shutilCopier, déplacer, archiver, espace disquecopy2, copytree, move, make_archive, disk_usage, which
subprocessLancer une commandesubprocess.run([cmd, arg], capture_output=True, text=True, timeout=10) ; jamais shell=True avec une saisie
argparseOptions de la ligne de commandeadd_argument("source"), add_argument("-n", "--simulation", action="store_true"), type=int
loggingJournalbasicConfig(level=…, format=…, handlers=[…]), journal.info("… %s", x), journal.exception()
datetimeDates et duréesdatetime.now(), date.fromisoformat(), strftime("%Y-%m-%d_%H%M"), strptime, timedelta(days=30)
reExpressions régulièresre.search, re.fullmatch, re.findall, re.sub, re.compile, groupes (?P<nom>…)
ipaddressAdresses et réseauxip_network("192.168.10.176/28"), .hosts(), ip in reseau, .overlaps(), .subnets(new_prefix=26)
socketPort TCP, DNSsocket.create_connection((hote, port), timeout=2), socket.gethostbyname(nom)
hashlibEmpreinteshashlib.file_digest(f, "sha256").hexdigest() (fichier ouvert en "rb")
zipfileArchives zipZipFile(nom, "w", compression=ZIP_DEFLATED), .write(f, arcname=…), .testzip()
csv, jsonÉchanges de donnéesVoir ci-dessus
sqlite3Base SQL localeconnexion.execute("… WHERE code = ?", (code,)), with connexion: pour une transaction
urllib.requestHTTP sans paqueturlopen(Request(url, headers=…), timeout=10)
concurrent.futuresParalléliser des attentesThreadPoolExecutor(max_workers=32).map(fonction, elements)
collectionsCompter, regrouperCounter, defaultdict
dataclasses, enumClasses de données@dataclass(order=True), field(default_factory=list), StrEnum

Expressions régulières

MotifSens
\d \w \s .Chiffre, caractère de mot, espace, n'importe quel caractère
[a-z] [^;]Un caractère de l'intervalle ; tout sauf ;
* + ? {n} {m,n}0 ou plus, 1 ou plus, 0 ou 1, exactement n, de m à n
^ $ \bDébut, fin, frontière de mot
(…) (?P<nom>…) (?:…) a|bGroupe, groupe nommé, groupe sans capture, alternative

Toujours une chaîne brute : r"\d+". Pour valider une saisie entière : re.fullmatch.

Requêtes HTTP avec requests

python
r = requests.get(url, params={"page": 1}, headers={"Authorization": f"Bearer {jeton}"}, timeout=5)
r.raise_for_status()                          # exception si 4xx ou 5xx
donnees = r.json()
r = requests.post(url, json={"mois": "2026-11"}, timeout=5)    # corps JSON
# Erreurs : requests.HTTPError, ConnectionError, Timeout ; toutes : requests.RequestException

Tests avec pytest

python
import pytest

@pytest.mark.parametrize("prefixe, attendu", [(24, 254), (30, 2)])
def test_hotes(prefixe, attendu):
    assert hotes(prefixe) == attendu

def test_erreur():
    with pytest.raises(ValueError, match="invalide"):
        hotes(33)

def test_fichier(tmp_path, monkeypatch): ...    # dossier temporaire ; remplacer une fonction

python -m pytest -q lance tout ; -v détaille, -k mot filtre, -x s'arrête au premier échec.

Les pièges les plus fréquents

PiègeCorrection
input() renvoie une chaîne : "12" + "3" vaut "123"int(input(...))
range(1, 10) s'arrête à 9La borne de fin est exclue
= au lieu de == dans une condition= affecte, == compare
liste = liste.sort() donne Noneliste.sort() ou liste = sorted(liste)
b = a ne copie pas une listeb = a.copy()
[[0] * 3] * 3 : trois fois la même ligne[[0] * 3 for _ in range(3)]
def f(x, l=[]) : liste partagée entre les appelsdef f(x, l=None), puis if l is None: l = []
0.1 + 0.2 == 0.3 vaut Falseround(…, 2), ou math.isclose(a, b)
"srv-ad\n" == "srv-ad" vaut Falseligne.strip()
Colonne '\ufeffnom' introuvable dans un CSVencoding="utf-8-sig"
except: passIntercepter une exception précise, journaliser
requests.get(url) sans délaitimeout=5
Requête SQL construite avec une f-stringParamètres ? (ou %s)
Script nommé csv.py, random.pyRenommer, supprimer __pycache__
pip install refusé sur Debian (externally-managed-environment)Environnement virtuel, ou paquet python3-…

Chapitre terminé !

Tu as lu ce chapitre jusqu'au bout. Passe au suivant tant que c'est frais.

chapitres
–
de série
–
du cours
–
Cours suivant : HTML et CSSRevoir le sommaire du cours