Je trouve particulièrement difficile la lecture de fichier binaire avec Python. Peux-tu me donner un coup de main? J'ai besoin de lire ce fichier, qui dans 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)
En 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 lire cela avec Python? J'ai tout essayé mais cela n'a jamais fonctionné. Y a-t-il une chance que je puisse utiliser un programme f90 en python, lire ce fichier binaire puis enregistrer les données dont j'ai besoin?
fromfile
fonction de Numpy facilite la lecture des fichiers binaires. Je le recommande.Réponses:
Lisez le contenu du fichier binaire comme ceci:
puis "décompresser" les données binaires en utilisant struct.unpack :
Les octets de début:
struct.unpack("iiiii", fileContent[:20])
Le corps: ignorez les octets d'en-tête et l'octet de fin (= 24); La partie restante forme le corps, pour connaître le nombre d'octets dans le corps faire une division entière 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:L'octet de fin:
struct.unpack("i", fileContent[-4:])
la source
import struct
En général, je vous recommande d'utiliser le module struct de Python pour cela. C'est standard avec Python, et il devrait être facile de traduire la spécification de votre question dans une chaîne de formatage adaptée à
struct.unpack()
.Notez que s'il y a un remplissage "invisible" entre / autour des champs, vous devrez le comprendre et l'inclure dans l'
unpack()
appel, ou vous lirez les mauvais bits.Lire le contenu du fichier pour avoir quelque chose à décompresser est assez trivial:
Cela décompresse les deux premiers champs, en supposant qu'ils commencent au tout début du fichier (pas de remplissage ou de données superflues), et en supposant également l'ordre des octets natif (le
@
symbole). LeI
s dans la chaîne de formatage signifie "entier non signé, 32 bits".la source
Vous pouvez utiliser
numpy.fromfile
, qui peut lire des données à partir de fichiers texte et binaires. Vous devez d'abord construire un type de données, qui représente votre format de fichier, en utilisantnumpy.dtype
, puis lire ce type à partir du fichier en utilisantnumpy.fromfile
.la source
Pour lire un fichier binaire dans un
bytes
objet:Pour créer un à
int
partir des octets 0-3 des données:Pour décompresser plusieurs
int
s des données:pathlib
int.from_bytes()
struct
la source
J'ai moi aussi trouvé que Python manquait quand il s'agissait de lire et d'écrire des fichiers binaires, j'ai donc écrit un petit module (pour Python 3.6+).
Avec binaryfile, vous feriez quelque chose comme ça (je suppose, puisque je ne connais pas Fortran):
Ce qui produit une sortie comme celle-ci:
J'ai utilisé skip () pour ignorer les données supplémentaires ajoutées par Fortran, mais vous voudrez peut-être ajouter un utilitaire pour gérer correctement les enregistrements Fortran. Si vous le faites, une demande d'extraction serait la bienvenue.
la source
la source
pickle.load
charge? Charge-t-il un flux Fortran, des fichiers directs ou séquentiels? Ils sont différents et non compatibles.