Pregunta general sobre archivos binarios

Soy un principiante y tengo problemas para captar archivos binarios. Cuando escribo en un archivo en modo binario (en python), solo escribo texto normal. No hay nada binario al respecto. Sé que cada archivo en mi computadora es un archivo binario, pero tengo problemas para distinguir entre los archivos escritos en modo binario por mí y los archivos de audio, video, etc. que aparecen como increibles si los abro en un editor de texto.

¿Cómo se crean los archivos que aparecen como gibberish? ¿Puede por favor dar un ejemplo de un archivo pequeño que se crea así, preferiblemente en python?

Tengo la sensación de que estoy haciendo una pregunta realmente estúpida, pero solo tenía que hacerla. Googlear alrededor no me ayudó.

Cuando escribo en un archivo en modo binario (en python), solo escribo texto normal.

Tendrá que cambiar su enfoque cuando actualice a Python 3.x:

>>> f = open(filename, 'wb') >>> f.write("Hello, world!\n") Traceback (most recent call last): File "", line 1, in  TypeError: must be bytes or buffer, not str >>> f.write(b"Hello, world!\n") 14 

Pero tu pregunta no es realmente sobre archivos binarios. Se trata de str .

En Python 2.x, str es una secuencia de bytes que tiene un significado sobrecargado:

  • Una cadena que no sea Unicode, o
  • Datos binarios sin procesar (como píxeles en una imagen).

Si imprime este último como si fuera el primero, obtendrá un alboroto.

Python 3.x eliminó este doble significado al introducir un tipo de bytes separado para datos binarios, dejando a str inequívocamente como una cadena de texto (y convirtiéndolo en Unicode).

Aquí hay una respuesta literal a tu pregunta:

 import struct with open('gibberish.bin', 'wb') as f: f.write(struct.pack('<4d', 3.14159, 42.0, 123.456, 987.654)) 

Eso es empaquetar esos 4 números de punto flotante en un formato binario (punto flotante de 64 bits IEEE 756 de little-endian).

Esto es (algo de) lo que necesitas saber:

Leer y escribir un archivo en modo binario no incurre en ninguna transformación en los datos que usted lee o escribe. En el modo de texto, así como en cualquier deencoding / encoding a / desde Unicode, los datos que lee o escribe se transforman de acuerdo con las convenciones de la plataforma para "archivos de texto".

Unix / Linux / Mac OS X: sin cambios

Mac anterior: el separador de línea es \r , cambiado a / desde el estándar de Python \n

Windows: el separador de línea es \r\n , cambiado a / desde \n . También (hecho poco conocido), Ctrl-Z aka \x1a se interpreta como fin de archivo, una convención heredada de CP/M que registraba los tamaños de archivo como el número de sectores de 128 bytes utilizados.

Los llamados archivos de “texto” son simplemente archivos que siguen ciertas convenciones: los bytes son generalmente un subconjunto de todos los bytes posibles, generalmente valores ASCII o Unicode, y se organizan en “líneas” con “terminadores de línea”. Los terminadores de línea estándar varían según la plataforma: Unix usa \n , Mac y Windows \r\n , por lo que parte de la convención es traducirlos sobre la marcha. Esto funciona bien con archivos de texto, pero atacará otros tipos de archivos, ya que un 0x0a ( \n ) en un archivo de sonido o algo no tardará en convertirse a 0x0d 0x0a ( \r\n ). Por supuesto, si solo has estado usando Unix, esto no habrá surgido.

En Python 3, todas las cadenas son Unicode, y abrir un archivo como texto significa que tiene que leer y escribir cadenas Unicode, y tal vez especificar una encoding (por defecto es UTF-8). Abrir un archivo como binario significa que tiene que usar objetos de bytes , que son listas simples de bytes de 8 bits y no se codifican.

¿Aclara esto las cosas?

Los archivos binarios se crean normalmente cuando intentas codificar objetos. Por ejemplo, podría tener un objeto Person con propiedades como Nombre, Edad, Altura. Si escribiera este archivo como texto para que pueda volver a leerlo más tarde, podría mostrar algo como esto:

 Name:Ralph Age:25 Height:5'6" 

Pero puedes representarlo de forma más compacta en binario. En binario, puede mostrar el nombre, la edad y la altura uno tras otro, y tendrá que volver a leerlos exactamente en el mismo orden porque ya no tiene estos delimitadores. En ese caso, su cadena tendría que codificarse con algo como Ralph\0 . El \0 es el carácter nulo para que sepa dónde termina la cadena.

Los 25 pueden representarse como solo 2 caracteres en texto / ASCII, pero si intentara poner dos números uno al lado del otro, como 25 y 26, obtendría 2526 y no sabría dónde termina uno y comienza el siguiente. Estos números son en realidad números enteros y se representan por 4 bytes. Cuando escribes un archivo como binario, escribes los 4 bytes, incluso si los bits más a la izquierda son todos 0. De esa manera, siempre se sabe exactamente cuánto leer. Etcétera…

Es por eso que los “archivos binarios” parecen jibberish, porque tienen toda esta información adicional en ellos.

Para generar estos archivos, tendría que codificar o “empaquetar” sus datos como sugiere John Machin.

¿Tal vez estás enviando una cadena en tu archivo binario y tu computadora puede decodificarla y mostrarla? Intenta escribir un archivo con un byte aleatorio. O puede mostrarnos su código para que podamos entender el problema.

Recomiendo usar el módulo de codecs de Python para escribir archivos de texto (le permite configurar el conjunto de caracteres / encoding relacionados). Para escribir un archivo binario use el método estándar de archivo (). En Windows puede necesitar usar ‘wb’ o ‘rb’ para modos binarios (no importa en Unix).