Encuentro particularmente difícil leer archivos binarios con Python. ¿Puedes darme una mano? Necesito leer este archivo, que en Fortran 90 es fácilmente leído por
int*4 n_particles, n_groups
real*4 group_id(n_particles)
read (*) n_particles, n_groups
read (*) (group_id(j),j=1,n_particles)
En detalle, el formato de archivo es:
Bytes 1-4 -- The integer 8.
Bytes 5-8 -- The number of particles, N.
Bytes 9-12 -- The number of groups.
Bytes 13-16 -- The integer 8.
Bytes 17-20 -- The integer 4*N.
Next many bytes -- The group ID numbers for all the particles.
Last 4 bytes -- The integer 4*N.
¿Cómo puedo leer esto con Python? Intenté todo pero nunca funcionó. ¿Existe alguna posibilidad de que pueda usar un programa f90 en Python, leer este archivo binario y luego guardar los datos que necesito usar?
fromfile
función de Numpy facilita la lectura de archivos binarios. Lo recomiendo.Respuestas:
Lea el contenido del archivo binario como este:
luego "descomprime" los datos binarios usando struct.unpack :
Los bytes de inicio:
struct.unpack("iiiii", fileContent[:20])
El cuerpo: ignore los bytes de encabezado y el byte final (= 24); La parte restante forma el cuerpo, para saber el número de bytes en el cuerpo haz una división entera entre 4; El cociente obtenido se multiplica por la cadena
'i'
para crear el formato correcto para el método de descomprimir:El byte final:
struct.unpack("i", fileContent[-4:])
fuente
import struct
En general, le recomendaría que considere usar el módulo struct de Python para esto. Es estándar en Python, y debería ser fácil traducir la especificación de su pregunta a una cadena de formato adecuada para
struct.unpack()
.Tenga en cuenta que si hay un relleno "invisible" entre / alrededor de los campos, tendrá que averiguarlo e incluirlo en la
unpack()
llamada, o leerá los bits incorrectos.Leer el contenido del archivo para tener algo que descomprimir es bastante trivial:
Esto descomprime los dos primeros campos, asumiendo que comienzan desde el principio del archivo (sin relleno o datos extraños), y también asumiendo el orden de bytes nativo (el
@
símbolo). LaI
s en la cadena de formato significa "entero sin signo, 32 bits".fuente
Puede usar
numpy.fromfile
, que puede leer datos de archivos de texto y binarios. Primero debe construir un tipo de datos, que representa su formato de archivo, usandonumpy.dtype
, y luego leer este tipo desde el archivo usandonumpy.fromfile
.fuente
Para leer un archivo binario en un
bytes
objeto:Para crear un
int
desde los bytes 0-3 de los datos:Para descomprimir varios correos electrónicos
int
de los datos:pathlib
int.from_bytes()
struct
fuente
Yo también encontré que Python carece de lectura y escritura de archivos binarios, así que escribí un pequeño módulo (para Python 3.6+).
Con binaryfile harías algo como esto (supongo, ya que no conozco a Fortran):
Lo que produce una salida como esta:
Usé skip () para omitir los datos adicionales que agrega Fortran, pero es posible que desee agregar una utilidad para manejar los registros de Fortran correctamente. Si lo hace, sería bienvenida una solicitud de extracción.
fuente
fuente
pickle.load
carga? ¿Carga un flujo de Fortran, archivos directos o secuenciales? Son diferentes y no compatibles.