Fiches mémo Python

L'essentiel à retenir — fiche imprimable (syntaxe, structures, requests, regex, Netmiko)

1. Syntaxe de base

print("Texte", variable)     # affichage
nom = "R1"                    # variable (snake_case)
port = int("8080")            # conversion str -> int
texte = f"VLAN {vlan} actif"  # f-string

if n > 50:                   # conditions
    niveau = "critique"
elif n > 10:
    niveau = "suspect"
else:
    niveau = "normal"

for h in ["R1", "SW1"]:       # boucle for
    print(h)
for i in range(1, 6):         # 1..5
    print(f"10.0.0.{i}")

n = 5                         # boucle while
while n > 0:
    print(n)
    n -= 1

def carre(x):                 # fonction
    """Retourne le carre de x."""
    return x * x

Opérateurs

OpérateurRôle
//Division entière
%Modulo (reste)
**Puissance (2 ** 8 = 256)
and or notLogique (pas de &&)
inAppartenance

Erreurs courantes

ErreurCause
SyntaxErrorDeux-points, parenthèse, indentation
NameErrorVariable inexistante / faute de frappe
TypeErrorMélange de types ("3" + 4)
ValueErrorint("abc"), choix invalide
IndexErrorIndex hors bornes
KeyErrorClé absente (utiliser .get)

2. Structures de données

# LISTE : ordonnee, modifiable
ports = [22, 80, 443]
ports.append(8080)
print(ports[0], ports[-1], len(ports))
ouverts = [p for p in ports if p < 1024]  # comprehension

# TUPLE : immuable (configs fixes)
r = ("192.168.1.0", 24)

# SET : valeurs uniques
ioc = {"5.6.7.8", "9.9.9.9"}
detectes = set(observes) & ioc   # intersection

# DICT : paires cle-valeur (configs, JSON)
eq = {"hostname": "R1", "ip": "10.0.0.1"}
eq.get("vlan", 1)          # acces sur, defaut 1
for cle, val in eq.items():
    print(cle, val)
compteurs = {h: 0 for h in ["R1", "SW1"]}
À retenir : listes pour des séquences, dicts pour des objets nommés (équipements, réponses JSON), sets pour dédupliquer et croiser, tuples pour les constantes.

3. Fichiers, CSV, JSON

with open("f.txt", "w",
          encoding="utf-8") as f:
    f.write("R1\n")

import csv
with open("p.csv", newline="",
          encoding="utf-8") as f:
    for eq in csv.DictReader(f):
        print(eq["hostname"])

import json
d = json.loads('{"ip": "1.1.1.1"}')
txt = json.dumps(d, indent=2)

try:
    p = int(saisie)
except ValueError:
    p = 22

4. Regex (module re)

import re
m = re.search(r"Gi\d+/\d+", lig)
ips = re.findall(
  r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})",
  logs)
m = re.search(r"SRC=(?P<ip>...)", lig)
m.group("ip")
re.sub(r"\d+\.\d+\.\d+\.\d+",
       "[IP]", log)
MotifSens
\d \w \sChiffre, mot, espace
+ * ?1+, 0+, optionnel
(...)Groupe capturé
search/matchPartout / début

5. API REST avec requests

import requests
h = {"Authorization": "Token X"}
r = requests.get(url, headers=h,
                 timeout=10)
r.raise_for_status()
for eq in r.json()["results"]:
    print(eq["hostname"])

r = requests.post(url, json=payload,
                  headers=h, timeout=10)
# 200 OK | 201 Created | 401 | 404 | 500
Règles : toujours un timeout, toujours raise_for_status(), token en variable d'environnement.

6. Netmiko et SOC

from netmiko import ConnectHandler
dev = {"device_type": "cisco_ios",
       "host": "10.0.0.1",
       "username": "admin",
       "password": "..."}
with ConnectHandler(**dev) as ssh:
    print(ssh.send_command(
        "show ip interface brief"))
    ssh.send_config_set(["vlan 30",
        "name INVITES"])
    ssh.save_config()

from collections import Counter
top = Counter(sources).most_common(5)
alertes = set(sources) & ioc
Lab uniquement : testez en environnement isolé, sauvegardez avant tout changement, journalisez avec logging.

Sources

Contenu de synthèse extrait des cours Débutant, Intermédiaire, Expert et de la banque Examen blanc (js/banque.js). Testez chaque extrait dans le terminal Python intégré.