C'est une fonction open() C'est l'un des outils les plus utilisés en Python. Il est essentiel pour manipuler des fichiers, qu'il s'agisse de les lire, de les écrire ou de les modifier. Grâce à sa simplicité et sa flexibilité, les programmeurs peuvent effectuer de nombreuses opérations sur des fichiers texte ou binaires en quelques étapes seulement.

Apprendre à utiliser correctement cette fonction permet de gagner un temps précieux et d'éviter les erreurs courantes lors de la manipulation de fichiers. Dans ce guide, vous apprendrez à l'utiliser. open() Pour ouvrir les fichiers de différentes manières et comment sélectionner le mode approprié pour la lecture ou l'écriture, ainsi que des exemples pratiques qui vous aideront à les comprendre et à les appliquer facilement.
La fonction open en Python devrait être votre premier choix pour lire le contenu d'un fichier. Donnez-lui un nom de fichier et vous obtiendrez un objet polyvalent permettant de lire et d'écrire des données, qu'elles soient au format texte brut ou binaire.
Ces exemples démontrent à quel point cette fonction est flexible, avec la prise en charge de différents modes, de la mise en cache, de l'encodage, etc.
Ouvrir un fichier et lire son contenu
La fonction open() a une signature assez complexe, mais dans le cas le plus simple, vous pouvez l'utiliser pour ouvrir un fichier texte comme ceci :
f = open(filename)
Par défaut, Python ouvre ce fichier en mode lecture, ce qui signifie que vous ne pouvez lire que son contenu. C'est idéal pour les fichiers de configuration, les fichiers de données statiques, etc. Cela rend également ce cas courant concis et facile à mémoriser.
La fonction open() renvoie un objet fichier que vous pouvez utiliser pour effectuer diverses tâches, notamment la lecture de l'intégralité du contenu d'un fichier :
f = open("/usr/share/dict/words")
text = f.read()
print(text)

Notez que cet extrait simple amènera Python à lever une exception si le fichier n'existe pas :
Le seul fichier garanti est le script que vous exécutez, que Python met à disposition dans la variable spéciale __file__. Cela facilite l'écriture d'un script affichant son propre code source, également appelé quine:
f = open(__file__)
text = f.read()
print(text)

ملاحظة
Si vous êtes trop strict, ce n'est pas tout à fait vrai, car lire un fichier est considéré comme de la triche.
Utilisez le mot-clé with pour fermer automatiquement un fichier
Lorsque Python ouvre un fichier, il lui alloue des ressources système, qu'il utilise ensuite pour des opérations ultérieures telles que la lecture et l'écriture. Si votre programme continue de s'exécuter, Python nettoie ces ressources et les met à disposition d'autres processus potentiellement en cours d'exécution sur votre système. Cependant, cela n'est pas garanti ; il est donc important de toujours s'assurer que les ressources sont correctement nettoyées. Le moyen le plus simple est d'appeler explicitement la fonction close() sur votre fichier une fois votre travail terminé :
f = open("/usr/share/dict/words")
text = f.read()
f.close()
conseil
Assurez-vous de fermer le fichier le plus rapidement possible. Par exemple, si vous ouvrez un fichier, lisez son contenu, puis le traitez, essayez de le fermer immédiatement après l'avoir lu. Il n'est pas nécessaire de garder le fichier ouvert pendant le traitement des données lues dans une variable.
Mais des problèmes peuvent survenir : que se passe-t-il si l'appel à close() ne fonctionne pas correctement ? Pour contourner ce problème, utilisez le mot-clé with. Cela crée un gestionnaire de contexte pour le bloc encapsulé, garantissant ainsi la libération des ressources du fichier.
with open("/usr/share/dict/words") as f:
text = f.read()
Copier le fichier en lisant et en écrivant
Plusieurs bibliothèques Python proposent des méthodes pour copier un fichier ; cet exemple est donc purement illustratif. Il illustre l'utilisation du deuxième argument d'open, mode. Cet argument indique à open comment utiliser le fichier. Vous pouvez utiliser n'importe quelle combinaison valide de ces caractères :
| Personnage | Sens |
|---|---|
| r | Lire |
| w | Écrire |
| x | Créer et écrire |
| a | Ajouter |
| b | binaire |
| t | Texte |
| + | Mises à jour |
Le mode par défaut est rt (lecture de fichier texte), le premier exemple de cet article a donc fonctionné comme prévu. Pour copier le fichier lu, vous devrez ouvrir un second fichier en mode w pour l'écriture. Vous devrez également utiliser le mode b pour les deux afin de garantir que les opérations de lecture et d'écriture prennent en compte les données binaires.
source = "./image.jpg"
target = "./a-copy-of-image.jpg"
with open(source, "rb") as src, open(target, "wb") as tgt:
buffer = src.read()
tgt.write(buffer)
Le bloc with fonctionne sur les deux fichiers, il les fermera donc automatiquement une fois terminé.
ملاحظة
Alors que la fonction open de Python vous donne un accès de bas niveau au contenu d'un fichier, le module os fournit plusieurs fonctions de haut niveau qui opèrent sur les fichiers et le système de fichiers.
Créer un nouveau fichier texte
Vous pouvez également utiliser l'argument mode pour créer un nouveau fichier, mais protégez tout fichier portant le même nom qui pourrait déjà exister :
open(filename, "x")
Si un fichier portant le même nom existe déjà, cet appel ouvrira une exception FileExistsError. Cette précaution évite de vérifier explicitement l'existence du fichier :
# Warning: don't do this!
import os.path
filename = "example.txt"
if os.path.isfile(filename):
print("Sorry, file already exists")
else:
with open(filename, "w") as f:
# ...
Outre l'économie de code, l'utilisation du mode « x » présente une raison encore plus valable : elle évite les situations de concurrence. Prenons l'exemple ci-dessus, qui comprend une instruction pour vérifier l'existence du fichier (if os.path.isfile(filename)), suivie d'une autre instruction pour l'ouvrir en écriture (en utilisant open(filename, "w") comme f). Si un autre processus exécute une action sur ce fichier entre ces deux instructions, un désastre peut survenir.
Ouvrir un fichier en mode création permet d'éviter un désastre, car une seule instruction suffit pour vérifier et ouvrir le fichier. Soit l'opération échoue et le fichier existant est protégé, soit elle réussit et aucun autre processus ne peut créer un autre fichier portant le même nom entre-temps.
Écriture dans un fichier journal via un plugin
Par défaut, un fichier ouvert en écriture est d'abord tronqué, son contenu étant alors remplacé. Pour ajouter un fichier, vous pouvez utiliser le mode ajout :
log = open("file.log", "a")
Encore une fois, la journalisation d'une entrée en Python facilite l'utilisation du module de journalisation, qui gère de nombreuses Des détails déroutants. Par exemple, vous pouvez enregistrer une entrée dans un fichier à l’aide d’un code similaire à celui-ci :
def startup():
print("Just a dummy")
def main():
print("Doing the main thing")
return 42
def log(msg):
logfile.write(msg + "\n")
logfile = open("file.log", "w")
log("starting startup")
startup()
log("startup finished")
log("starting main")
ret = main()
log("main finished: " + str(ret))
logfile.close()
Utilisez la mise en cache pour contrôler l’enregistrement des fichiers.
Pour éviter de rouvrir et d'enregistrer constamment le même fichier, l'exemple de journalisation utilise une variable globale et un identifiant de fichier à longue durée de vie. Cela semble acceptable dans un exemple simple, mais en réalité, votre programme peut s'exécuter indéfiniment et vous pouvez consulter ce fichier journal à tout moment. Si vous le faites, vous pourriez être surpris :
while True:
log(random.random())
input("Press Enter to continue")
Ce code simule la journalisation récurrente d'un processus long. Vous pouvez contrôler la journalisation en appuyant sur Entrée pour enregistrer une nouvelle ligne. Cependant, à l'exécution, vous remarquerez une faille majeure : si vous appuyez plusieurs fois sur Entrée et consultez le fichier journal, vous constaterez qu'il n'y a aucune écriture !
conseil
La commande tail, plus précisément tail -f, peut vous aider à suivre immédiatement les modifications apportées à un fichier journal.
Si vous appuyez sur Entrée suffisamment de fois, vous obtiendrez des résultats, car la sortie aura dépassé la taille de tampon par défaut de Python. Sur mon système, cette taille est de 8 192 octets, et son accumulation prendra beaucoup de temps.
Heureusement, dans de tels cas, il existe un argument de mise en mémoire tampon qui permet de spécifier une politique de mise en cache. Dans le cas d'un fichier journal, la mise en mémoire tampon des lignes est une excellente solution.
Essayez d’exécuter l’exemple précédent avec une légère modification :
logfile = open("file.log", "w", 1)
Le troisième argument, 1, spécifie la mise en mémoire tampon des lignes. Lorsqu'il est activé, le fichier journal est mis à jour à chaque exécution de la fonction log(), car il inclut un caractère de nouvelle ligne lors de l'écriture dans le fichier.
Spécifiez un encodage pour prendre correctement en charge UTF-8.
L'encodage des caractères est un sujet complexe, mais l'adoption généralisée de l'UTF-8 aujourd'hui signifie que vous n'avez pratiquement plus à vous en préoccuper. Cependant, certains systèmes plus anciens peuvent utiliser d'autres encodages, et qui sait ce qui pourrait arriver à l'avenir ? Les erreurs d'encodage peuvent entraîner des problèmes majeurs.
L'UTF-16 est une alternative à l'UTF-8 et est plus efficace pour certains types de texte. La plupart des textes en anglais sont mieux adaptés à l'UTF-8, mais les textes dans d'autres langues ou jeux de caractères, comme un fichier contenant des émojis, seront plus petits s'ils sont stockés en UTF-16.
Si vous essayez d'ouvrir un fichier UTF-16 en utilisant la méthode d'ouverture standard, vous verrez l'erreur suivante :
La fonction open attend l'encodage UTF-8 par défaut, avec quelques réserves, vous devrez donc spécifier l'encodage pour ouvrir un fichier UTF-16 :
f = open("../utf16-file.txt", encoding="utf-16")
En utilisant un argument nommé, vous pouvez conserver les valeurs par défaut des arguments mode et cache. Vous pouvez également leur spécifier des valeurs par défaut (ou personnalisées) :
f = open("../utf16-file.txt", "r", -1, "utf-16")
Même si vous ouvrez un fichier encodé en UTF-8, il est recommandé de déclarer explicitement l'encodage avec cet argument. Certains systèmes d'exploitation (comme Windows) peuvent utiliser d'autres encodages ; il est donc déconseillé de se fier à la valeur par défaut.

Gestion des fichiers mal formatés à l'aide de l'opérateur d'erreur
Bien qu'il faille veiller à spécifier un encodage spécifique, cela n'est pas toujours possible. Cependant, la fonction open n'échoue pas nécessairement en cas d'erreur d'encodage ; vous pouvez utiliser le paramètre error pour choisir son comportement parmi plusieurs options.
La valeur par défaut est « strict », ce qui génère une exception, mais vous pouvez ignorer complètement ces erreurs en utilisant « ignore » :
f = open("../utf16-file.txt", errors='ignore')
L'inconvénient est que vous pourriez désormais manipuler des données corrompues à votre insu. Votre capacité à gérer ce problème dépend de la nature de vos données.
Une alternative courante consiste à remplacer les caractères manquants par un caractère indiquant leur absence, généralement un point d'interrogation. Vous avez peut-être déjà constaté ce comportement sur des pages web mal encodées. Une valeur « replace » pour le paramètre d'erreur permet d'obtenir cet effet.
Enfin, la valeur « barre oblique inverse » remplacera chaque caractère mal formé par son équivalent, une séquence d'échappement Python à barre oblique inverse. Cela peut vous aider à corriger la cause du problème et peut donc être utile pour les tests ou dans le cadre d'une boîte à outils de développement.
Maîtrise des fonctions open() C'est une étape essentielle pour tout programmeur Python travaillant avec des données stockées dans des fichiers. Que vous souhaitiez lire les paramètres d'un fichier texte ou créer un fichier pour stocker les résultats de votre programme, comprendre les différentes options d'ouverture, de fermeture et de mode rend votre travail plus professionnel. Essayez les exemples vous-même pour constater comment cette fonction simplifie votre programmation quotidienne.



