Différence entre `open` et` io.BytesIO` dans les flux binaires
Je suis en train d'apprendre sur le travail avec les flux en Python et j'ai remarqué que le IO docs dire suivantes:
La façon la plus simple pour créer un flux binaire est avec open() avec " b " dans la chaîne de mode:
f = open("myfile.jpg", "rb")
En mémoire les flux binaires sont également disponibles comme BytesIO objets:
f = io.BytesIO(b"some initial binary data: \x00\x01")
Quelle est la différence entre f
tel que défini par open
et f
tel que défini par BytesIO
. En d'autres termes, ce qui fait une "en mémoire Dans le flux binaire" et comment est-ce différent de ce que open
?
source d'informationauteur Luke Whyte
Vous devez vous connecter pour publier un commentaire.
Pour des raisons de simplicité, nous allons envisager d'écrire au lieu de lire pour l'instant.
Ainsi, lorsque vous utilisez
open()
comme le disent:Après l'exécution d'un fichier appelé
test.dat
sera créé, contenantHello World
. Les données ne seront pas conservées en mémoire une fois que c'est écrit dans le fichier (à moins d'être gardé par un nom).Maintenant, quand vous considérez
io.BytesIO()
à la place:Qui, au lieu d'écrire le contenu d'un fichier, il est écrit dans une mémoire tampon. En d'autres termes, une partie de la RAM. Essentiellement de l'écriture de la suite serait l'équivalent:
Par rapport à l'exemple avec l'instruction, puis à la fin il y aurait aussi un
del buffer
.La clé de la différence ici, c'est de l'optimisation et de la performance.
io.BytesIO
est capable de faire quelques optimisations qui le rend plus rapide que de simplement la concaténation de tous lesb"Hello World"
un par un.Juste pour le prouver, voici un petit indice:
Outre le gain de performance de l'aide
BytesIO
au lieu de la concaténation. C'est queBytesIO
peut être utilisé à la place d'un fichier objet. Donc, disons que vous avez une fonction qui attend un objet fichier à écrire. Ensuite, vous pouvez lui donner en mémoire tampon à la place.Quand il s'agit de
open("myfile.jpg", "rb")
que, tout simplement, les charges et retourne le contenu demyfile.jpg
. OùBytesIO
de nouveau, tout est un tampon contenant certaines données.Depuis
BytesIO
est juste un tampon, si vous souhaitez écrire le contenu d'un fichier plus tard, vous auriez à faire:Aussi, puisque vous n'avez pas mention d'une version, je suis à l'aide de Python 3. Liées à des exemples, c'est tout simplement que je suis l'aide de l'instruction, au lieu de l'appeler
f.close()
À l'aide de
open
ouvre un fichier sur votre disque dur. Selon le mode que vous utilisez, vous pouvez lire ou écrire (ou les deux) à partir du disque.Un
BytesIO
objet n'est pas associé à un fichier sur le disque. C'est juste une partie de la mémoire qui se comporte comme un fichier. Il a la même API que un fichier objet renvoyé deopen
(avec moder+b
permettant la lecture et l'écriture de données binaires).BytesIO
(et il est proche de la fratrieStringIO
qui est toujours en mode texte) peut être utile lorsque vous avez besoin de transmettre des données vers ou à partir d'une API qui s'attendent à être donné un fichier objet, mais l'endroit où vous préférez passer directement les données. Vous pouvez charger vos données que vous avez dans leBytesIO
avant de la donner à la bibliothèque. Après son retour, vous pouvez obtenir toutes les données de la bibliothèque a écrit dans le fichier de laBytesIO
à l'aide de lagetvalue()
méthode. (Généralement vous ne devez le faire un de ces, bien sûr.)octets lus à partir d'un fichier à partir du disque disque et affecter cette valeur à l'objet référencé en tant que " f " qui est tenu par Python dans la mémoire.
attribuer des flux d'octets de la valeur à l'objet référencé en tant que " f " qui est tenu par Python dans la mémoire.