Bytearrays: continuación
Entonces, ¿cómo escribimos un arreglo de bytes en un archivo binario?
Observa el código en el editor. Analicémoslo:
- Primero, inicializamos
bytearray
con valores a partir de10
; si deseas que el contenido del archivo sea claramente legible, reemplaza el10
con algo comoord('a')
, esto producirá bytes que contienen valores correspondientes a la parte alfabética del código ASCII (no pienses que harás que el archivo sea un archivo de texto; sigue siendo binario, ya que se creó con un indicador - banderawb
). - Después, creamos el archivo usando la función
open()
, la única diferencia en comparación con las variantes anteriores es que el modo de apertura contiene el indicadorb
. - El método
write()
toma su argumento (bytearray
) y lo envía (como un todo) al archivo. - El stream se cierra de forma rutinaria.
El método write()
devuelve la cantidad de bytes escritos correctamente.
Si los valores difieren de la longitud de los argumentos del método, puede significar que hay algunos errores de escritura.
En este caso, no hemos utilizado el resultado; esto puede no ser apropiado en todos los casos.
Intenta ejecutar el código y analiza el contenido del archivo recién creado.
Lo vas a usar en el siguiente paso.
Cómo leer bytes de un stream
La lectura de un archivo binario requiere el uso de un método especializado llamado readinto()
, ya que el método no crea un nuevo objeto del arreglo de bytes, sino que llena uno creado previamente con los valores tomados del archivo binario.
Nota:
- El método devuelve el número de bytes leídos con éxito.
- El método intenta llenar todo el espacio disponible dentro de su argumento; si existen más datos en el archivo que espacio en el argumento, la operación de lectura se detendrá antes del final del archivo; el resultado del método puede indicar que el arreglo de bytes solo se ha llenado de manera fragmentaria (el resultado también lo mostrará y la parte del arreglo que no está siendo utilizada por los contenidos recién leídos permanece intacta).
Mira el código completo a continuación:
from os import strerror
data = bytearray(10)
try:
bf = open('file.bin', 'rb')
bf.readinto(data)
bf.close()
for b in data:
print(hex(b), end=' ')
except IOError as e:
print("Se produjo un error de E/S: ", strerr(e.errno))
Analicémoslo:
- Primero, abrimos el archivo (el que se creó usando el código anterior) con el modo descrito como
rb
. - Luego, leemos su contenido en el arreglo de bytes llamado
data
, con un tamaño de diez bytes. - Finalmente, imprimimos el contenido del arreglo de bytes: ¿Son los mismos que esperabas?
Ejecuta el código y verifica si funciona.
Code
from os import strerrordata = bytearray(10)
for i in range(len(data)):
data[i] = 10 + i
try:
bf = open('file.bin', 'wb')
bf.write(data)
bf.close()
except IOError as e:
print("Se produjo un error de E/S: ", strerr(e.errno))
# ingresa aquí el código que lee los bytes del stream