Прочитанный двоичный файл на Фортране на Python

Я пытаюсь прочитать вывод двоичного файла из кода Fortran ниже, но результаты не совпадают с выходным файлом.

Код Фортрана 77:

    program test
    implicit none
    integer i,j,k,l
    real*4       pcp(2,3,4)
    open(10, file='pcp.bin', form='unformatted')
    l = 0
    do i=1,2
      do j=1,2
        do k=1,2
          print*,k+l*2
          pcp(i,j,k)=k+l*2
          l = l + 1
        enddo
      enddo
    enddo
    do k=1,4
       write(10)pcp(:,:,k)
    enddo
    close(10)
    stop
    end

Я пытаюсь использовать код Python ниже:

from scipy.io import FortranFile
f = FortranFile('pcp.bin', 'r')
a = f.read_reals(dtype=float)
print(a)
 Alexander Vogt31 мая 2016 г., 00:16
 marcelorodrigues31 мая 2016 г., 00:33
Спасибо, ребята, но я пробую оба решения. В моем коде на Фортране есть переменная 3d и реальная * 4 точность.
 glls31 мая 2016 г., 00:19

Ответы на вопрос(2)

Решение Вопроса

Потому что ты пишешьreal*4 данные в последовательном файле, просто попробуйте заменитьdtype=float вdtype='float32' (или жеdtype=np.float32) в read_reals ():

>>> from scipy.io import FortranFile
>>> f = FortranFile( 'pcp.bin', 'r' )
>>> print( f.read_reals( dtype='float32' ) )
[  1.   9.   5.  13.   0.   0.]
>>> print( f.read_reals( dtype='float32' ) )
[  4.  12.   8.  16.   0.   0.]
>>> print( f.read_reals( dtype='float32' ) )
[ 0.  0.  0.  0.  0.  0.]
>>> print( f.read_reals( dtype='float32' ) )
[ 0.  0.  0.  0.  0.  0.]

Полученные данные соответствуют каждомуpcp(:,:,k) в Фортране, что подтверждается

do k=1,4
   print "(6f8.3)", pcp(:,:,k)
enddo

который дает (сpcp инициализируется до нуля)

   1.0   9.0   5.0  13.0   0.0   0.0
   4.0  12.0   8.0  16.0   0.0   0.0
   0.0   0.0   0.0   0.0   0.0   0.0
   0.0   0.0   0.0   0.0   0.0   0.0

Но потому что>>> help( FortranFile ) говорит

Пример неформатированного последовательного файла в Фортране будет записан как:

OPEN(1, FILE=myfilename, FORM='unformatted')

WRITE(1) myvariable

Поскольку это нестандартный формат файла, содержимое которого зависит от компилятора и порядкового номера машины, рекомендуется соблюдать осторожность. Известно, что файлы из gfortran 4.8.0 и gfortran 4.1.2 на x86_64 работают.

Подумайте об использовании файлов Fortran с прямым доступом или файлов из более нового Stream I / O, которые легко читаютсяnumpy.fromfile.

это может быть проще в использованииnumpy.fromfile() в зависимости от случаев (как показано в ответе StanleyR).

http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html)

Я предполагаю, что вы что-то пропустили в коде Фортрана, чтобы записать в двоичный файл, примените этот код:

program test
implicit none
integer i,j,k,l, reclen
real*4       pcp(2,3,4)

inquire(iolength=reclen)pcp(:,:,1)
open(10, file='pcp.bin', form='unformatted', access = 'direct', recl = reclen)
pcp = 0
l = 0
do i=1,2
do j=1,2
do k=1,2
   print*,i,j,k,k+l*2
   pcp(i,j,k)=k+l*2
   l = l + 1
enddo
enddo
enddo
do k=1,4
   write(10, rec=k)pcp(:,:,k)
enddo
close(10)
end

Чтобы прочитать файл с помощью Python:

import numpy as np
with open('pcp.bin','rb') as f:
    for k in xrange(4):
        data = np.fromfile(f, dtype=np.float32, count = 2*3)
        print np.reshape(data,(2,3))

Выход:

[[  1.   9.   5.]
 [ 13.   0.   0.]]
[[  4.  12.   8.]
 [ 16.   0.   0.]]
[[ 0.  0.  0.]
 [ 0.  0.  0.]]
[[ 0.  0.  0.]
 [ 0.  0.  0.]]
 francescalus31 мая 2016 г., 09:40
Ваш ответ выглядит так: «Вы должны изменить программу на Фортране, чтобы использовать прямой, а не последовательный доступ в выходных данных». Если это намерение (что является значительным изменением), возможно, было бы лучше быть более откровенным об этом?

Ваш ответ на вопрос