Comment lire une partie du fichier binaire avec numpy?
Je suis de la conversion d'un script matlab pour numpy, mais certains ont des problèmes avec la lecture des données à partir d'un fichier binaire. Est-il un equivelent à fseek
lors de l'utilisation de fromfile
pour sauter au début du fichier? C'est le type d'extractions j'ai besoin de le faire:
fid = fopen(fname);
fseek(fid, 8, 'bof');
second = fread(fid, 1, 'schar');
fseek(fid, 100, 'bof');
total_cycles = fread(fid, 1, 'uint32', 0, 'l');
start_cycle = fread(fid, 1, 'uint32', 0, 'l');
Merci!
source d'informationauteur brorfred
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le chercher avec un objet de fichier de la façon normale, et ensuite utiliser ce fichier objet dans
fromfile
. Voici un exemple complet:Il n'y a probablement une meilleure réponse... Mais quand j'ai été confronté à ce problème, j'ai un fichier que je voulais déjà d'accéder aux différentes parties séparément, ce qui m'a donné une solution facile à ce problème.
Par exemple, dire
chunkyfoo.bin
est un fichier composé de 6 octets d'en-tête, une résolution de 1024 octetsnumpy
tableau, et un autre de 1 024 octetsnumpy
tableau. Vous ne pouvez pas ouvrir le fichier et chercher de 6 octets (car la première chosenumpy.fromfile
n'estlseek
retour à 0). Mais vous pouvez tout simplementmmap
le fichier et d'utiliserfromstring
à la place:Cela sonne comme exactement ce que vous voulez faire. Sauf, bien sûr, que dans la vraie vie, le décalage et la longueur de
a1
eta2
probablement dépendent de l'en-tête, plutôt que d'être fixé commentaires.L'en-tête est juste
m[:6]
et vous pouvez analyser que par explicitement le tirant à part, à l'aide de lastruct
module, ou ce que vous feriez une fois que vousread
les données. Mais, si vous préférez, vous pouvez explicitementseek
etread
def
avant de construirem
ou après, ou même faire les mêmes appels surm
et il va travailler, sans affectera1
eta2
.Une alternative, ce qui je l'ai fait pour un autre non-
numpy
liées au projet, est de créer un wrapper de l'objet fichier, comme ceci:J'ai fait le "délégué tout le reste inchangé" par la génération d'un
list
des attributs au moment de la construction et de l'aide que dans__getattr__
mais vous voudrez probablement quelque chose de moins hacky.numpy
ne repose que sur une poignée de méthodes de fichier-comme l'objet, et je pense qu'ils sont correctement documentés, donc juste explicitement délégué. Mais je pense que lemmap
solution a plus de sens ici, sauf si vous essayez d'mécaniquement port sur un tas de expliciteseek
à base de code. (Vous pensezmmap
serait également vous donner la possibilité de sortir unnumpy.memmap
au lieu d'unnumpy.array
qui permetnumpy
avoir plus de contrôle plus/feedback de la pagination, etc. Mais c'est en fait assez difficile d'obtenir unnumpy.memmap
et unmmap
à travailler ensemble.)C'est ce que je fais quand je dois lire arbitraire dans une hétérogènes fichier binaire.
Numpy permet d'interpréter une séquence de bits dans arbitray en changeant les dtype de la matrice.
Le code Matlab dans le lit de la question d'un
char
et deuxuint
.Lire ce papier (en faciliter la lecture sur le niveau de l'utilisateur, pas pour les scientifiques) sur ce que l'on peut atteindre avec l'évolution de la dtype, foulée, la dimensionnalité d'un tableau.