Как читать и извлекать значения из двоичного файла, используя код Python? - PullRequest
0 голосов
/ 19 мая 2019

Я относительно новичок в питоне. В рамках моей работы над астрономическим проектом мне приходится иметь дело с двоичными файлами (что, конечно же, для меня снова ново). Мне дали двоичный файл и код Python, который считывает данные из двоичного файла. Затем мой профессор попросил меня понять, как код работает с двоичным файлом. Я провел пару дней, пытаясь понять, но ничего не помогло. Может ли кто-нибудь здесь помочь мне с кодом?

# Read the binary opacity file
f = open(file, "r")

# read file dimension sizes
a = np.fromfile(f, dtype=np.int32, count=16)
NX, NY, NZ = a[1], a[4], a[7]


# read the time and time step
time, time_step = np.fromfile(f, dtype=np.float64, count=2)

# number of iterations
nite = np.fromfile(f, dtype=np.int32, count=1)

# radius array
trash = np.fromfile(f, dtype=np.float64, count=1)
rad = np.fromfile(f, dtype=np.float64, count=a[1])

# phi array
trash = np.fromfile(f, dtype=np.float64, count=1)
phi = np.fromfile(f, dtype=np.float64, count=a[4])

# close the file
f.close()

Бинарный файл, насколько мне известно, содержит несколько параметров (например, радиус, фи, скорость звука, энергия излучения) и его множество значений. Приведенный выше код извлекает значения 2 параметров - радиуса и фи из двоичного файла. Оба радиуса и фи имеют более 100 значений. Программа работает, но я не могу понять, как она работает. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019
from astropy.io import ascii    
data = ascii.read('/directory/filename')
column1data = data[nameofcolumn1]
column2data = data[nameofcolumn2]

т. Д.Теперь column1data - это массив всех значений в этом заголовке. Я использую этот метод для импорта файлов данных SourceExtractor в формате ASCII.Я считаю, что это более элегантный способ импорта данных из файлов ASCII.

0 голосов
/ 19 мая 2019

Бинарный файл - это просто длинный список непрерывных данных;вам нужно сообщить np.fromfile () обоим , где искать и , какой тип данных ожидать.Возможно, это будет проще понять, если вы создадите свой собственный файл:

import numpy as np

with open('numpy_testfile', 'w+') as f:
    ## we create a "header" line, which collects the lengths of all relevant arrays
    ## you can then use this header line to tell np.fromfile() *how long* the arrays are
    dimensions=np.array([0,10,0,0,10,0,3,10],dtype=np.int32)
    dimensions.tofile(f) ## write to file

    a=np.arange(0,10,1) ## some fake data, length 10
    a.tofile(f) ## write to file
    print(a.dtype)

    b=np.arange(30,40,1) ## more fake data, length 10
    b.tofile(f) ## write to file
    print(b.dtype)

    ##  more interesting data, this time it's of type float, length 3
    c=np.array([3.14,4.22,55.0],dtype=np.float64) 
    c.tofile(f) ## write to file
    print(c.dtype)

    a.tofile(f) ## just for fun, let's write "a" again

with open('numpy_testfile', 'r+b') as f:
    ### what's important to know about this step is that 
    #   numpy is "seeking" the file automatically, i.e. it is considering 
    #   the first count=8, than the next count=10, and so on 
    #   as "continuous data"
    dim=np.fromfile(f,dtype=np.int32,count=8)
    print(dim) ## our header line: [ 0 10  0  0 10  0  3 10]
    a=np.fromfile(f,dtype=np.int64,count=dim[1])## read the dim[1]=10 numbers
    b=np.fromfile(f,dtype=np.int64,count=dim[4])## and the next 10
    ## now it's dim[6]=3, and the dtype is float 10
    c=np.fromfile(f,dtype=np.float64,count=dim[6] )#count=30)
    ## read "the rest", unspecified length, let's hope it's all int64 actually!
    d=np.fromfile(f,dtype=np.int64) 

print(a)
print(b)
print(c)
print(d)

Приложение: документация * numy весьма явна, когда речь идет о , препятствующемиспользуйте из np.tofile() и np.fromfile():

Не полагайтесь на комбинацию tofile и fromfile для хранения данных, поскольку сгенерированные двоичные файлы не зависят от платформы.В частности, информация о порядке байтов или типе данных не сохраняется.Данные могут храниться в независимом от платформы формате .npy, используя вместо этого сохранение и загрузку.

Примечание для личного лица: если вы потратили пару дней на понимание этого кода, не делайтея не чувствую разочарования от обучения python;мы все начинаем где-тоЯ бы посоветовал быть честным в отношении препятствий, с которыми вы столкнулись перед своим профессором (если это возникнет в разговоре), поскольку она / он должны быть в состоянии правильно утверждать, «где вы находитесь», когда речь идет о программировании.: -)

...