Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

385
Views
Diferencia entre `open` y `io.BytesIO` en flujos binarios

Estoy aprendiendo a trabajar con transmisiones en Python y noté que los documentos de IO dicen lo siguiente:

La forma más fácil de crear un flujo binario es con open() con 'b' en la cadena de modo:

f = open("myfile.jpg", "rb")

Los flujos binarios en memoria también están disponibles como objetos BytesIO:

f = io.BytesIO(b"some initial binary data: \x00\x01")

¿Cuál es la diferencia entre f definida por open y f definida por BytesIO . En otras palabras, ¿qué hace un "flujo binario en memoria" y en qué se diferencia de lo que hace open ?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

En aras de la simplicidad, consideremos escribir en lugar de leer por ahora.

Entonces, cuando usas open() como decir:

 with open("test.dat", "wb") as f: f.write(b"Hello World") f.write(b"Hello World") f.write(b"Hello World")

Después de ejecutar eso, se creará un archivo llamado test.dat , que contiene 3x Hello World . Los datos no se guardarán en la memoria después de que se escriban en el archivo (a menos que se guarden con un nombre).

Ahora, cuando considere io.BytesIO() en su lugar:

 with io.BytesIO() as f: f.write(b"Hello World") f.write(b"Hello World") f.write(b"Hello World")

Que en lugar de escribir el contenido en un archivo, se escribe en un búfer de memoria. En otras palabras, una porción de RAM. Esencialmente, escribir lo siguiente sería el equivalente:

 buffer = b"" buffer += b"Hello World" buffer += b"Hello World" buffer += b"Hello World"

En relación con el ejemplo con la instrucción with, al final también habría un del buffer .

La diferencia clave aquí es la optimización y el rendimiento. io.BytesIO puede hacer algunas optimizaciones que lo hacen más rápido que simplemente concatenar todos los b"Hello World" uno por uno.

Solo para probarlo, aquí hay un pequeño punto de referencia:

  • Concat: 1.3529 segundos
  • BytesIO: 0.0090 segundos

 import io import time begin = time.time() buffer = b"" for i in range(0, 50000): buffer += b"Hello World" end = time.time() seconds = end - begin print("Concat:", seconds) begin = time.time() buffer = io.BytesIO() for i in range(0, 50000): buffer.write(b"Hello World") end = time.time() seconds = end - begin print("BytesIO:", seconds)

Además de la ganancia de rendimiento, usar BytesIO en lugar de concatenar tiene la ventaja de que BytesIO se puede usar en lugar de un objeto de archivo. Supongamos que tiene una función que espera que se escriba un objeto de archivo. Entonces puede darle ese búfer en memoria en lugar de un archivo.

La diferencia es que open("myfile.jpg", "rb") simplemente carga y devuelve el contenido de myfile.jpg ; mientras que BytesIO nuevamente es solo un búfer que contiene algunos datos.

Dado que BytesIO es solo un búfer, si quisiera escribir el contenido en un archivo más tarde, tendría que hacer lo siguiente:

 buffer = io.BytesIO() # ... with open("test.dat", "wb") as f: f.write(buffer.getvalue())

Además, no mencionaste una versión; Estoy usando Python 3. Relacionado con los ejemplos: estoy usando la instrucción with en lugar de llamar a f.close()

over 4 years ago · Santiago Trujillo Report

0

El uso open abre un archivo en su disco duro. Según el modo que utilice, puede leer o escribir (o ambos) desde el disco.

Un objeto BytesIO no está asociado con ningún archivo real en el disco. Es solo una porción de memoria que se comporta como un archivo. Tiene la misma API que un objeto de archivo devuelto desde open (con modo r+b , que permite leer y escribir datos binarios).

BytesIO (y su hermano cercano StringIO que siempre está en modo de texto) puede ser útil cuando necesita pasar datos hacia o desde una API que espera recibir un objeto de archivo, pero donde preferiría pasar los datos directamente. Puede cargar los datos de entrada que tiene en BytesIO antes de dárselos a la biblioteca. Después de que regrese, puede obtener cualquier dato que la biblioteca haya escrito en el archivo desde BytesIO usando el método getvalue() . (Por lo general, solo necesitaría hacer uno de esos, por supuesto).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!