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

У меня есть двоичный файл, который является * .xyz, двоичный файл plot3d. Я не знаю, как читать это с Python. У меня нет проблем, чтобы открыть его текстовый аналог, но как я могу открыть этот двоичный файл напрямую?

Бинарный файл выглядит так (первые 30 строк):

0400 0000 0a00 0000 0400 0000 7800 0000
0200 0000 2100 0000 0100 0000 0200 0000
2100 0000 0100 0000 0200 0000 0100 0000
1500 0000 0200 0000 0100 0000 1500 0000
0200 0000 0100 0000 1900 0000 0200 0000
0100 0000 1900 0000 0200 0000 0100 0000
1500 0000 0200 0000 0100 0000 1500 0000
0200 0000 0100 0000 1500 0000 0200 0000
0100 0000 1500 0000 7800 0000 3807 0000
0000 0060 3bdf ef3f 0000 0060 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f
ac1c 5a64 3bdf ef3f ac1c 5a64 3bdf ef3f

Соответствующий текст выглядит так (первые 30 строк):

          10
           2          33           1           2          33           1
           2           1          21           2           1          21
           2           1          25           2           1          25
           2           1          21           2           1          21
           2           1          21           2           1          21
  0.995999991893768       0.995999991893768       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.996000000000000       0.996000000000000     
  0.996000000000000       0.995999991893768       0.995999991893768     
  2.333463643677469E-003  2.333463643677469E-003  2.219304467294528E-003
  2.219304467294528E-003  2.105145290300329E-003  2.105145290300329E-003

По этому поводу у меня есть несколько вопросов здесь:

1: Это тот случай, когда мне нужно, во-первых, преобразовать двоичный файл в текстовую информацию, а во-вторых, прочитать его как чтение текстового файла?

2: Это тот случай, когда языки программирования, такие как python, способны преобразовывать двоичную информацию в текстовую информацию, не зная заранее формат?

with open('oldsurf.p3d', 'rb') as OldSurf:
    bn=next(OldSurf).split()
    BlockNumber=int(bn[0])
    print('There are ', BlockNumber, ' Blocks in total.')
    BlockDimension=[[0 for i in range(3)] for bi in range(BlockNumber)]
    ln=(BlockNumber-1)//2+1
    for li in range(ln):
        d=next(OldSurf).split()
        bi=li*2
        for i in range(3):
            BlockDimension[bi][i]=int(d[i])
        if len(d)==6:
            bi=li*2+1
            for i in range(3):
                BlockDimension[bi][i]=int(d[i+3])
    print('The Dimensions of Blocks are: ', BlockDimension)
    value=[]
    for line in OldSurf:
        for word in line.split():
            value.append(float(word))

Эта проблема существовала в течение долгого времени, но до сих пор не нашла возможного решения, пожалуйста, приветствуется любое возможное решение, большое спасибо!

Ответы [ 2 ]

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

ОК, я решил проблему самостоятельно, используя модуль FortranFile:

from scipy.io import FortranFile

Есть:

read_ints()
read_reals()

Подробности: https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.FortranFile.html

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

Я действительно знаю, как читать это на Фортране. Я просто не знаю, как Python работает над этим. Может быть, я должен спросить: может ли кто-нибудь помочь интерпретировать следующий код Фортрана в Python:

  parameter ( imax  = 100 )
  parameter ( jmax  = 100 )
  parameter ( kmax  = 100 )
  parameter ( nbmax =  10 )

  integer i
  integer j
  integer m
  integer n
  integer nblocks
  integer ni (nbmax)
  integer nj (nbmax)
  integer nk (nbmax)

  real mach   ! freestream Mach number
  real alpha  ! freestream angle-of-attack
  real reyn   ! freestream Reynolds number
  real time   ! time

  real x(imax,jmax,kmax,nbmax)
  real y(imax,jmax,kmax,nbmax)
  real z(imax,jmax,kmax,nbmax)

  real q(imax,jmax,kmax,nbmax,5)

  open ( unit=7, form='unformatted', file='3D.x' )
  open ( unit=8, form='unformatted', file='3D.q' )

  read(7) nblocks
  read(7) ( ni(m), nj(m), nk(m), m = 1, nblocks )
  do  m = 1, nblocks
    read(7) 
 &    ((( x(i,j,k,m), i=1,ni(m)), j=1,nj(m)), k=1,nk(m)),
 &    ((( y(i,j,k,m), i=1,ni(m)), j=1,nj(m)), k=1,nk(m)),
 &    ((( z(i,j,k,m), i=1,ni(m)), j=1,nj(m)), k=1,nk(m))
  enddo

  read(8) nblocks
  read(8) ( ni(m), nj(m), nk(m), m = 1, nblocks )
  do  m = 1, nblocks
    read(8) mach, alpha, reyn, time
    read(8) 
 &    (((( q(i,j,k,m,n), i=1,ni(m)), j=1,nj(m)), k=1,nk(m)), n=1,5)
  enddo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...