with open("notes.txt", "w", encoding="utf-8") as file:
file.write("Audit du serveur srv-web\n")
with open("notes.txt", encoding="utf-8") as file:
content = file.read()
print(content) # Audit du serveur srv-web
| Mode | Effet |
|---|---|
"r" | lecture (par défaut) |
"w" | écriture, qui écrase le fichier |
"a" | ajout à la fin |
D'autres modes existent, comme "r+" (lecture et écriture). Ils sont décrits dans la documentation de open().
encoding="utf-8". Sans lui, Windows utilise un autre encodage et les accents deviennent illisibles.
Oct 9 10:02:11 srv-web sshd[2210]: Failed password for root from 203.0.113.45 port 51122 ssh2
Oct 9 10:15:44 srv-web sshd[2303]: Failed password for root from 198.51.100.23 port 40031 ssh2
Oct 9 11:31:02 srv-web sshd[2410]: Accepted password for Cosmo from 192.0.2.10 port 42230 ssh2
failures = {}
with open("auth.log", encoding="utf-8") as log:
for line in log:
if "Failed password" in line:
words = line.split()
ip = words[words.index("from") + 1]
failures[ip] = failures.get(ip, 0) + 1
print(failures)
# {'203.0.113.45': 1, '198.51.100.23': 1}
for line in log lit une ligne à la fois
from datetime import datetime # dates et heures
def log_event(message):
# date et heure actuelles, au format 2026-10-09T10:42:05
now = datetime.now().isoformat(timespec="seconds")
with open("actions.log", "a", encoding="utf-8") as file:
file.write(f"{now} {message}\n")
log_event("Ajout de Jagger Fount")
log_event("Retrait de Hugo Crast")
2026-10-09T10:42:05 Ajout de Jagger Fount
2026-10-09T10:42:05 Retrait de Hugo Crast
datetime gère les dates et les heures"a" ajoute à la fin du journalwrite() n'ajoute pas de retour à la ligne. Écrivez le \n vous-même
try:
with open("report.txt", encoding="utf-8") as file:
print(file.read())
except FileNotFoundError:
print("Fichier introuvable")
except PermissionError:
print("Accès refusé : droits insuffisants")
from pathlib import Path
path = Path("auth.log")
print(path.exists()) # True
print(path.suffix) # .log
pathlib manipule les chemins sous Windows, macOS et Linux| JSON | Python |
|---|---|
objet {} | dict |
tableau [] | list |
| chaîne, nombre | str, int, float |
true / false / null | True / False / None |
{
"server": "srv-web",
"ports": [22, 443],
"mfa": true,
"owner": "Équipe SOC"
}
import json
config = {"server": "srv-web", "ports": [22, 443],
"mfa": True, "owner": "Équipe SOC"}
with open("config.json", "w", encoding="utf-8") as file:
json.dump(config, file, indent=2, ensure_ascii=False)
with open("config.json", encoding="utf-8") as file:
loaded = json.load(file)
print(loaded["ports"]) # [22, 443]
text = json.dumps(config) # dict → str
print(json.loads(text)["mfa"]) # True
dump / load : vers ou depuis un fichierdumps / loads : vers ou depuis une chaîne (le « s » de string)indent=2 : un fichier indenté, donc lisibleensure_ascii=False : les accents restent lisibles
class User:
def __init__(self, username, role):
self.username = username
self.role = role
def to_dict(self):
return {"username": self.username, "role": self.role}
def user_from_dict(data):
return User(data["username"], data["role"])
data = []
for user in users:
data.append(user.to_dict())
with open("users.json", "w", encoding="utf-8") as file:
json.dump(data, file, indent=2)
json.dumps(users) lève TypeError: Object of type User is not JSON serializableuser_from_dict() refait l'objetto_dict()
def load_users(path):
try:
with open(path, encoding="utf-8") as file:
data = json.load(file)
except FileNotFoundError:
return [] # premier lancement
except json.JSONDecodeError:
print("Sauvegarde corrompue")
return []
users = []
for item in data:
users.append(user_from_dict(item))
return users
print(len(load_users("absent.json"))) # 0
print(len(load_users("users.json"))) # 2
json.JSONDecodeError
ROLES = ["analyste", "auditeur", "admin"]
def user_from_dict(data):
if data.get("role") not in ROLES:
raise ValueError(f"rôle inconnu : {data.get('role')}")
return User(data["username"], data["role"])
user_from_dict({"username": "eve", "role": "root"})
# ValueError: rôle inconnu : root
json ne fait que lire des données. Il n'exécute jamais de codeeval() (qui exécute une chaîne comme du code Python) sur des données non fiables. Un fichier piégé suffirait à exécuter du code sur votre machine.
| Notion | À retenir |
|---|---|
| Fichiers texte | with open(…, encoding="utf-8") ; modes "r", "w" et "a" ; lecture ligne par ligne |
| Dates | datetime.now() pour horodater un journal |
| Erreurs de fichier | FileNotFoundError, PermissionError |
| JSON | json.dump() et json.load() ; to_dict() pour les objets ; chargement qui ne plante pas |
| Sécurité | jamais d'eval() sur des données non fiables ; valider les données chargées |
| Horaire | Programme |
|---|---|
| 14h00 – 16h45 | TP1 – Fondation : gestion de l'équipage, avec mon accompagnement. Ceux qui ont fini enchaînent sur le TP2 |
| 16h45 – 17h00 | Kahoot : 10 questions sur la journée |