La lecture d'un fichier binaire avec python
Je trouve particulièrement difficile la lecture de fichier binaire avec Python. Pouvez-vous me donner un coup de main?
J'ai besoin de lire ce fichier, ce qui en Fortran 90 est facilement lu par
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)
Dans le détail, le format de fichier est:
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.
Comment puis-je lu avec Python? J'ai tout essayé mais il n'a jamais travaillé. Est-il une chance que je pourrais utiliser un f90 programme en python, la lecture de ce fichier binaire, puis enregistrer les données que je dois utiliser?
- A ce fichier écrit par un programme Fortran? Si oui, comment était-il écrit, depuis le Fortran, par défaut, ajoute des données avant de les écrire dans un fichier. Vous pouvez avoir besoin de prendre soin lors de la lecture des données.
- S'il vous plaît ignorer mon commentaire précédent, les entiers 8 et 4*N sont clairement des données complémentaires.
- Aussi, voir les réponses à la question lire un fichier binaire en python.
Vous devez vous connecter pour publier un commentaire.
Lire le fichier binaire contenu comme ceci:
puis "décompresser" données binaires à l'aide struct.décompresser:
Le début octets:
struct.unpack("iiiii", fileContent[:20])
Le corps: ignorer l'en-tête d'octets et de l'octet de fin (= 24); La partie restante des formes du corps, à savoir le nombre d'octets dans le corps entier de la division par 4; Le quotient obtenu est multiplié par la chaîne
'i'
pour créer le format correct pour la méthode de décompression:La fin de l'octet:
struct.unpack("i", fileContent[-4:])
import struct
En général, je recommande que vous regardez dans l'aide de Python struct module pour cela. C'est la norme avec Python, et il devrait être facile à traduire votre question de la spécification en une chaîne de mise en forme adaptée pour
struct.unpack()
.Ne remarque que si il est "invisible" padding entre/dans les champs, vous aurez besoin de comprendre cela et de l'inclure dans le
unpack()
appel, ou vous permettra de lire le mauvais bits.Lire le contenu du fichier afin d'avoir quelque chose pour décompresser est assez trivial:
Ce déballe les deux premiers champs, en supposant qu'ils commencent au début du fichier (pas de rembourrage ou des données superflues), et aussi en supposant natif d'ordre d'octet (le
@
symbole). LeI
s dans la chaîne de mise en forme signifie "entier non signé de 32 bits".Vous pouvez utiliser
numpy.fromfile
, qui peut lire les données provenant à la fois du texte et les fichiers binaires. Vous avez d'abord la construction d'un type de données, qui représente votre format de fichier, à l'aide denumpy.dtype
, puis lire ce type de fichier à l'aide denumpy.fromfile
.Pour lire un fichier binaire à un
bytes
objet:Pour créer un
int
d'octets 0-3 des données:Pour décompresser plusieurs
int
s à partir des données:pathlib
int.from_bytes()
struct
pickle.load
charge? Prend-il en charge une Fortran stream, direct ou fichiers séquentiels? Ils sont différents et ne sont pas compatibles.