#!/usr/bin/env python # coding: utf-8 # < [Modules](PythonIntroCh8_FR.ipynb) | [Contenu](PythonIntro_FR.ipynb) | [Gestion d'Exception](PythonIntroCh10_FR.ipynb) > # # 9. Fichier I/O # ## 9.1 Introduction # Dans la dernière leçon, nous avons appris comment charger du code externe dans notre programme. Sans aucune introduction (comme ce que j’ai habituellement), plongeons dans l’entrée et la sortie de fichiers avec des fichiers texte normaux, et plus tard l’enregistrement et la restauration d’instances de classes. (Wow, notre connaissance du jargon s’est grandement améliorée!) # ## 9.2 Ouverture d'un fichier # Pour ouvrir un fichier texte que vous utilisez, eh bien, la fonction `open()`. Cela semble raisonnable. Vous passez en revue certains paramètres de `open()` pour lui dire de quelle manière le fichier doit être ouvert - `r` pour la lecture seule, `w` pour l’écriture uniquement (s’il y a un ancien fichier, il sera reécrit), `a` pour l’ajout (ajout de choses à la fin du fichier) et `r+` pour la lecture et l’écriture. Mais parlons, ouvrons un fichier pour la lecture (vous pouvez le faire dans Spyder plus tard dans le cours). Ouvrez un fichier texte normal. Nous imprimerons ensuite ce que nous lisons dans le fichier: # ```Python # filename = 'C:\\temp\\readme.txt' # chemin vers le fichier.\ est un charactère d'espace, donc vous en avez besoins de 2 ou utiliser / plutôt. # fl = open(filename, 'r') # ouvrez le fichier # for line in fl: # print(line) # fl.close() #fermez le fichier # ``` # # Une meilleure façon d'écrire ceci est: # ```Python # filename = 'C:\\temp\\readme.txt' # with open(filename, 'r') as fl: # for line in fl: # print(line) # ``` # # Avec la deuxième méthode, vous n'avez pas besoin d'ajouter `fl.close`, il est automatiquement fermé. # ## 9.3 Seek and You Shall Find # Si vous souhaitez imprimer le fichier entier, au lieu de boucler sur les lignes, vous pouvez utiliser ceci: # ```Python # # filename = 'C:\\temp\\readme.txt' # fl = open(filename, 'r') # print(fl.read()) # ``` # # Avez-vous essayé d’exécuter `print(fl.read())` une deuxième fois? A-t-il échoué ? Il l’a probablement fait, et la raison est que le « curseur » a changé sa place. Curseur? Quel curseur ? Eh bien, un curseur que vous ne pouvez vraiment pas voir, mais quand-même un curseur. Ce curseur invisible indique à la fonction de lecture (et à de nombreuses autres fonctions d’I/O) par où commencer. Pour définir l’emplacement du curseur, vous utilisez la fonction `seek()`. Il est utilisé sous la forme `seek(offset, whence) `. # # `whence` est facultatif et détermine d’où chercher. Si `whence` est 0, les octets/lettres sont comptés dès le début. S’il est 1, les octets sont comptés à partir de la position actuelle du curseur. S’il est 2, les octets sont comptés à partir de la fin du fichier. Si rien n’y est mis, 0 est supposé. # # `offset` décrit de quelle distance de `whence` le curseur se déplace. par exemple: # * `fl.seek(45,0)` déplacerait le curseur à 45 octets/lettres après le début du fichier. # * `fl.seek(10,1)` déplacerait le curseur à 10 octets/lettres après la position actuelle du curseur. # * `fl.seek(-77,2)` déplacerait le curseur à 77 octets/lettres avant la fin du fichier (notifie le - avant le 77). # # Nous pouvons utiliser `fl.seek()` pour accéder à n’importe quel endroit du fichier, puis essayer de taper `print(fl.read())`. Il imprimera à partir de l’endroit que vous avez cherché. Mais réalisez que `fl.read()` déplace le curseur à la fin du fichier - vous devrez chercher à nouveau. # # ## 9.4 Autres Fonctions I/O # Il existe de nombreuses autres fonctions qui vous aident à traiter les fichiers. Ils ont de nombreuses utilisations qui vous permettent d’en faire plus et facilitent les choses que vous pouvez faire. Jetons un coup d’œil à `tell()`,`readline()`,`readlines()`,`write()` et `close()`. # # `tell()` renvoie l’emplacement du curseur dans le fichier. Il n’a pas de paramètres, il suffit de le taper (comme ce que l’exemple ci-dessous montrera). Ceci est infiniment utile, pour savoir à quoi vous faites référence, où il se trouve et un contrôle simple du curseur. Pour l’utiliser, tapez `fileobjectname.tell()` - où fileobjectname est le nom de l’objet fichier que vous avez créé lorsque vous avez ouvert le fichier (dans `openfile = open('pathtofile', 'r') ` le nom de l’objet fichier est 'openfile'). # `readline()` lit à partir de l’endroit où se trouve le curseur jusqu’à la fin de la ligne. N’oubliez pas que la fin de la ligne n’est pas le bord de votre écran - la ligne se termine lorsque vous appuyez sur Entrée pour créer une nouvelle ligne. Ceci est utile pour des choses comme la lecture d’un journal des événements, ou de parcourir quelque chose progressivement pour le traiter. Il n’y a pas de paramètres que vous devez passer à revue pour aller à `readline()`, bien que vous puissiez éventuellement lui indiquer le nombre maximal d’octets/lettres à lire en mettant un nombre entre crochets. Utilisez-le avec `fileobjectname.readline()`.
# # `readlines()` ressemble beaucoup à `readline()`, cependant `readlines()` lit toutes les lignes à partir du curseur et retourne une liste, chaque élément de liste contenant une ligne de code. Utilisez-le avec `fileobjectname.readlines()`. Par exemple, si vous aviez le fichier texte : # ``` # Line 1 # # Line 3 # Line 4 # # Line 6 # ``` # alors la liste renvoyée à partir de `readlines()` serait:
# # | Index | Value | # | :--: | :--: | # | 0 | 'Line 1' | # | 1 | " | # | 2 | 'Line 3' | # | 3 | 'Line 4' | # | 4 | " | # | 5 | 'Line 6' | # # La fonction `write()` écrit dans le fichier. Comment avez-vous deviné??? Il écrit à partir de l’endroit où se trouve le curseur et remplace le texte devant lui - comme dans MS Word, où vous appuyez sur ‘insérer ‘ et il écrit sur le dessus de l’ancien texte. Pour utiliser cette fonction la plus utile, placez une chaîne entre crochets pour écrire par exemple `fileobjectname.write('this is a string') `. # # `close`, vous pouvez comprendre, vous fermez le fichier afin que vous ne puissiez plus le lire ou l’écrire jusqu’à ce que vous l’ouvrez à nouveau. Assez simple. Pour l’utiliser, vous devez écrire `fileobjectname.close()`. Simple! # # Plus tard dans le cours, vous pouvez essayer cela dans la ligne de commande Python. Ouvrez un fichier de test (ou créez-en un nouveau...) et jouez avec ces fonctions. Vous pouvez faire une édition de texte simple (et très gênante). # ## 9.5 Mmm, Pickles # Les Pickles (cornichons), en Python, sont à manger. Leur saveur est tout simplement trop bonne pour permettre aux programmeurs de les laisser au réfrigérateur. # # Ok, juste une plaisanterie là-bas. Les Pickles, en Python, sont des objets enregistrés dans un fichier. Dans ce cas, un objet peut être une variable, une instance d’une classe ou une liste, un dictionnaire ou un tuple. D’autres choses peuvent également être enregistrées, mais avec des limites. L’objet peut ensuite être restauré, ou reenrégistré, ultérieurement. # # Alors, comment pouvons-nous enregistrer (pickle)? Avec la fonction `dump()`, qui se trouve à l’intérieur du module pickle - donc au début de votre programme, vous devrez écrire `import pickle`. Assez simple? Ouvrez ensuite un fichier vide et utilisez `pickle.dump()` pour déposer l’objet dans ce fichier. Essayons cela: # # ```Python # ### pickletest.py # ### PICKLE UN OBJET # # # importez le module pickle # import pickle # # # créons quelque chose à enregistrer # # Que diriez-vous d’une liste? # picklelist = ['one',2,'three','four',5,'can you count?'] # # # maintenant créez un fichier # # remplacez filename par le fichier que vous souhaitez créer # # wb signifie qu’il est écrit dans un fichier binaire # file = open('filename', 'wb') # # # maintenant enregistrons picklelist # pickle.dump(picklelist,file) # # # fermez le fichier et votre enregistrement est terminé # file.close() # ``` # # Le code pour ce faire est présenté comme `pickle.dump(object_to_pickle, file_object)` où: # * `object_to_pickle` est l’objet que vous souhaitez récupérer (c’est-à-dire l’enregistrer dans un fichier) # * `file_object` est l’objet fichier dans lequel vous souhaitez écrire (dans ce cas, l’objet fichier est `file`) # # Maintenant, pour rouvrir, ou déenregistrer de votre fichier, nous utiliserions `pickle.load()`:
# ```Python # ### unpickletest.py # ### unpickle file # # # importez le module pickle # import pickle # # # maintenant ouvre un fichier pour lecture # # remplacez filename par le chemin d’accès au fichier que vous avez créé dans pickletest.py # unpicklefile = open('filename', 'rb') # # # chargez maintenant la liste que nous avons enregistré dans un nouvel objet # unpickledlist = pickle.load(unpicklefile) # # # fermez le fichier, juste pour la sécurité # unpicklefile.close() # # # Essayez d’utiliser la liste # for item in unpickledlist: # print(item) # ``` # Génial, eh?
# # Bien sûr, la limitation ci-dessus est que nous ne pouvons mettre qu’un seul objet dans un fichier. Nous pourrions contourner ce problème en plaçant beaucoup d’objets picklables dans une liste ou un dictionnaire, puis en enregistrer cette liste ou ce dictionnaire. C’est le moyen le plus rapide et le plus simple, mais vous pouvez faire des choses assez avancées si vous avez des connaissances avancées de pickle.
# # Ce que nous ne couvrirons pas. # < [Modules](PythonIntroCh8_FR.ipynb) | [Contenu](PythonIntro_FR.ipynb) | [Gestion d'Exception](PythonIntroCh10_FR.ipynb) >