Hur man läser en del av binär fil med numpy Stack Overflow

Det är förmodligen ett bättre svar … Men när jag har stått inför detta problem, jag hade en fil som jag ville redan att få tillgång till olika delar av separat, vilket gav mig en enkel lösning på detta problem.

Till exempel, säger chunkyfoo.bin är en fil bestående av en 6-byte-huvudet, en 1024-byte numpy array, och en annan 1024-byte numpy array. Du kan inte bara öppna filen och söka 6 bytes (eftersom det första numpy.fromfile gör är lseek tillbaka till 0). Men du kan bara mmap filen och använda fromstring istället:

Detta låter som exakt vad du vill göra. Utom, naturligtvis, att i verkliga livet offset och längd till A1 och A2 förmodligen beror på huvudet, snarare än att vara fasta kommentarer.


Huvudet är bara m [: 6]. och du kan tolka det genom att uttryckligen dra isär med hjälp av struct modul, eller vad du vill göra när du läsa data. Men om du föredrar, kan du explicit söka och läsa från f innan bygga m. eller efter, eller ens göra samma samtal på m. och det kommer att fungera, utan att påverka a1 och a2.

Ett alternativ, som jag har gjort för en annan icke numpy -relaterade projektet är att skapa en wrapper filobjekt, som den här:

Jag gjorde "delegera allt annat oförändrat" genom att generera en lista över attribut vid byggtiden och använda det i __getattr__. men du förmodligen vill ha något mindre hacky. numpy förlitar sig bara på en handfull av metoder i filen liknande föremål, och jag tror att de dokumenteras ordentligt, så bara uttryckligen delegera dem. Men jag tror att mmap lösning är mer förnuftigt här, om du försöker att mekaniskt port över ett gäng explicit söka baserad kod. (Man skulle kunna tro mmap skulle också ge dig möjlighet att lämna det som en numpy.memmap i stället för en numpy.array. Som låter numpy har mer kontroll över / feedback från personsökning, etc. Men det är faktiskt ganska svårt att få en numpy.memmap och en mmap att arbeta tillsammans.)

svarade 9 januari ’13 vid 19:56

Källa: stackoverflow.com

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *

1 × 4 =