Aller au contenu

Fichiers & context managers#

courant

Ouverture avec with (recommandé)#

with open("data.txt", "r", encoding="utf-8") as f:
    contenu = f.read()
# fichier fermé automatiquement, même en cas d'exception

Modes d'ouverture#

Mode Rôle
"r" Lecture (défaut)
"w" Écriture, écrase le fichier existant
"a" Ajout en fin de fichier
"x" Création exclusive (échoue si le fichier existe)
"r+" Lecture + écriture
"b" (suffixe) Mode binaire, ex. "rb", "wb"

Lecture#

f.read()          # tout le contenu (str)
f.readline()        # une ligne
f.readlines()        # liste de lignes
for ligne in f:        # itération ligne par ligne (efficace en mémoire)
    print(ligne.strip())

Écriture#

with open("data.txt", "w", encoding="utf-8") as f:
    f.write("une ligne\n")
    f.writelines(["a\n", "b\n"])

Plusieurs fichiers dans un with#

with open("in.txt") as fin, open("out.txt", "w") as fout:
    fout.write(fin.read().upper())

Context manager personnalisé#

class Chrono:
    def __enter__(self):
        import time
        self.debut = time.perf_counter()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        import time
        print(f"durée : {time.perf_counter() - self.debut:.3f}s")
        return False   # ne supprime pas une exception éventuelle

with Chrono():
    ...

contextlib.contextmanager avancé#

from contextlib import contextmanager

@contextmanager
def chrono():
    import time
    debut = time.perf_counter()
    try:
        yield
    finally:
        print(f"durée : {time.perf_counter() - debut:.3f}s")

with chrono():
    ...