Bonjour à tous ! Dans l’article d’aujourd’hui, nous allons nous intéresser à l’utilisation du module Python IO.
Ce module est assez utile lorsque vous souhaitez effectuer des opérations d’E/S liées à des fichiers (ex. lecture/écriture de fichiers)
Bien que vous puissiez utiliser les méthodes normales read()
et write()
pour lire/écrire dans un fichier, ce module nous donne beaucoup plus de flexibilité concernant ces opérations.
Pour mieux comprendre ce module, prenons quelques exemples.
Module Python IO
Ce module fait partie de la bibliothèque standard, il n’est donc pas nécessaire de l’installer séparément avec pip.
Pour importer le module io, nous pouvons faire ce qui suit :
import io
Dans le io
module, il y a 2 classes communes qui nous sont très utiles :
- BytesIO -> opérations d’E/S sur des données octets
- StringIO ->> Opérations d’entrée/sortie sur des données de type chaîne de caractères
Nous pouvons accéder à ces classes en utilisant io.BytesIO
et io.StringIO
.
Regardons-les une par une.
Classe Python BytesIO
Ici, nous pouvons conserver nos données sous forme d’octets (b''
). Lorsque nous utilisons io.BytesIO
, les données sont conservées dans un tampon en mémoire.
Nous pouvons obtenir une instance au flux d’octets en utilisant le constructeur :
import iobytes_stream = io.BytesIO(b'Hello from Journaldev\x0AHow are you?')
Visualisez que nous passons une chaîne d’octets (préfixée en utilisant b
).
Pour l’instant, bytes_stream
est simplement un handle vers le flux d’octets.
Pour imprimer réellement les données à l’intérieur du tampon, nous devons utiliser bytes_stream.getvalue()
.
import iobytes_stream = io.BytesIO(b'Hello from Journaldev\x0AHow are you?')print(bytes_stream.getvalue())
Ici, getvalue()
prend la valeur de la chaîne d’octets du handle.
Puisque la chaîne d’octets \x0A
est la représentation ASCII de la nouvelle ligne (‘\n’), nous obtenons la sortie suivante :
Sortie
b'Hello from Journaldev\nHow are you?'
Maintenant, c’est toujours une bonne pratique de fermer notre handle de tampon lorsque nous avons terminé notre travail.
C’est aussi pour s’assurer que nous libérons toute la mémoire que nous avons allouée pour le tampon.
Pour fermer le tampon, utilisez :
bytes_stream.close()
Maintenant, regardons la classe StringIO.
Classe Python StringIO
Similaire à io.BytesIO
, la classe io.StringIO
peut lire les données relatives aux chaînes de caractères à partir d’un tampon StringIO.
import iostring_stream = io.StringIO("Hello from Journaldev\nHow are you?")
Nous pouvons lire à partir du tampon de chaîne de caractères en utilisant string_stream.read()
et écrire en utilisant string_stream.write()
. Ceci est très similaire à la lecture / écriture d’un fichier !
Nous pouvons imprimer le contenu en utilisant getvalue()
.
Sortie
Initially, buffer: Hello from JournaldevHow are you?Finally, buffer: This will overwrite the old content of the buffer if the length of this string exceeds the old content
Puisque nous écrivons dans le même tampon, le nouveau contenu écrasera évidemment l’ancien !
Lecture d’un tampon StringIO
Similairement à l’écriture, nous pouvons également lire un tampon StringIO en utilisant buffer.read()
.
import ioinput = io.StringIO('This goes into the read buffer.')print(input.read())
Sortie
This goes into the read buffer.
Comme vous pouvez le voir, le contenu se trouve maintenant à l’intérieur du tampon de lecture, qui est imprimé en utilisant buffer.read()
.
Lecture d’un fichier à l’aide de io
Nous pouvons utiliser la méthode io.open()
pour lire directement un fichier également, de manière similaire à la lecture d’un objet fichier.
Ici, ce module nous donne l’option de lecture tamponnée vs non tamponnée.
Par exemple, ce qui suit utilisera une lecture tamponnée pour lire un fichier, en définissant buffering = SIZE
. Si SIZE
= 0, cela impliquera l’absence de mise en mémoire tampon !
Supposons que sample.txt
ait le contenu suivant :
Hello from JournalDev!How are you?This is the last line.
Sortie
b'Hello from JournalDev!\nHow are you?\nThis is the last line.\n'
Comme vous pouvez le constater, le fichier a été lu avec succès ! Ici, io
lira le fichier en utilisant une taille de tampon d’environ 5 octets.
Utiliser io.open() vs os.open()
La fonction io.open() est une manière bien préférée d’effectuer des opérations d’E/S car elle est faite comme une interface Pythonique de haut niveau.
Au contraire, la fonction os.open()
effectuera un appel système à la fonction open()
. Celle-ci renverra un descripteur de fichier, qui ne pourra pas être utilisé comme l’objet handle io
.
Puisque io.open()
est une fonction wrapper de os.open()
, c’est généralement une bonne pratique d’utiliser de telles fonctions wrapper, car elles gèrent automatiquement de nombreuses erreurs pour vous.
Conclusion
Dans cet article, nous avons appris à utiliser le module Python IO, et ses deux classes principales – io.BytesIO
et io.StringIO
pour lire et écrire des données d’octets et de chaînes sur un tampon.