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 typebytesplutôt questr.
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 :
os.listdir()– renvoie une liste des noms présents dans un répertoire.os.remove()– supprime un fichier.os.rename()– renomme un fichier.os.stat()– métadonnées du fichier (taille, date de modification, …).os.mkdir()– crée un nouveau répertoire.
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.