2.27. Lecture et écriture#

Les fichiers résident sur disque ; Python y accède via open(), qui renvoie un objet fichier dont les méthodes lisent et écrivent les octets sous-jacents.

2.27.1. open et les modes#

Le premier argument est le chemin ; le second est le mode – une courte chaîne qui indique à Python comment le fichier sera utilisé :

  • "r" – lecture (par défaut). Ouvre un fichier existant en lecture.

  • "w" – écriture. Crée un nouveau fichier ou tronque à vide un fichier existant.

  • "a" – ajout. Ouvre un fichier en écriture à sa fin, sans le tronquer.

  • "b" ajouté à l’un des modes ci-dessus ("rb", "wb", "ab") – mode binaire. Le contenu du fichier est de type bytes plutôt que str.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Utilisez un gestionnaire de contexte#

Le motif ci-dessus laisse fuir le descripteur de fichier si quoi que ce soit entre open() et close lève une exception. La solution est l’instruction with (voir gestionnaires de contexte) :

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

C’est la forme standard – écrivez-la ainsi à chaque fois.

2.27.3. Lecture#

Les objets fichier prennent en charge plusieurs styles de lecture :

  • io.IOBase.read() – lit tout le fichier (ou N octets) et le renvoie sous forme d’une seule chaîne (ou objet bytes).

  • io.IOBase.readline() – lit une ligne, y compris le "\n" final.

  • Itérer directement le fichier produit les lignes une à une, avec une consommation mémoire bien moindre que la lecture du fichier entier d’un coup.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() supprime le saut de ligne final avant l’affichage afin que la sortie ne soit pas à double interligne.

2.27.4. Écriture#

Ouvrez le fichier en mode "w" et utilisez io.IOBase.write() :

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() n’ajoute pas de saut de ligne – il écrit exactement les octets (ou les caractères, en mode texte) que vous lui donnez.

2.27.5. Texte ou binaire#

Le mode texte (par défaut, "r" / "w" sans "b") décode les octets entrants en str à l’aide d’un encodage par défaut, et encode les str sortants de nouveau en octets. Utilisez-le pour la configuration, les journaux, le JSON – tout ce qui est du texte.

Le mode binaire ("rb" / "wb") saute l’étape de décodage et renvoie des bytes. Utilisez-le pour les images, les enregistrements empaquetés par struct, les captures réseau – tout cas où chaque octet compte et où le fichier n’est pas lisible par l’humain.

2.27.6. Lister et supprimer des fichiers#

Le module os expose les opérations du système de fichiers qui ne figurent pas sur l’objet fichier lui-même :

import os

for name in os.listdir("/"):
    print(name)

Interceptez OSError autour de ces opérations lorsque le fichier ou le répertoire peut ne pas exister – l’opération est l’un des endroits courants où les exceptions apparaissent dans les scripts réels.