저는 파이썬에 익숙한 초보자입니다. 나는 오히려 깊은 끝에 던져 버렸습니다. 약간의 배경 : 우리가 읽고있는 파일은 수중 음파 탐지기 카메라에서 가져온 것입니다. 지금은 날짜, 파일 이름, 프레임 수, 광선 수 등과 같은 파일에 기록 된 속성을 읽으려고합니다. 먼저 FILE 헤더를 읽으 려합니다. 그런 다음 각 프레임에 대해 FRAME 헤더를 읽고 싶습니다. 파일 헤더가 중단 된 프레임 헤더를 읽어야합니다 ...이 작업을 수행하려면 seek()이 필요하다고 생각합니다. 여기에 내가 그 정보는 프레임 헤더에 대한 끝나는 파일 헤더를 (성공적으로 완료) 읽고 시작, 현재 가지고있는 코드는 다음과 같습니다바이너리 파일을 읽는 동안 seek()
편집을 할 CODE : 이제
import math, struct
def __init__(didson):
print "this better work"
def get_file_header(data,offset=0):
fileheader={}
winlengths=[1.125,2.25,4.5,9,18,36]
fileheader['filetype']=struct.unpack("3s",didson_data[0:3])
fileheader['fileversion']=struct.unpack('B',didson_data[3:4])[0]
fileheader['numframes']=struct.unpack('l',didson_data[4:8])
fileheader['framerate']=struct.unpack('l',didson_data[8:12])
fileheader['resolution']=struct.unpack('i',didson_data[12:16])
fileheader['numbeams']=struct.unpack('i',didson_data[16:20])
fileheader['samplerate']=struct.unpack('f',didson_data[20:24])
fileheader['samplesperchannel']=struct.unpack('l',didson_data[24:28])
fileheader['receivergain']=struct.unpack('l',didson_data[28:32])
fileheader['windowstart']=struct.unpack('i',didson_data[32:36])
fileheader['winlengthsindex']=struct.unpack('i',didson_data[36:40])
fileheader['reverse']=struct.unpack('l',didson_data[40:44])
fileheader['serialnumber']=struct.unpack('l',didson_data[44:48])
fileheader['date']=struct.unpack("10s",didson_data[48:58])
#fileheader['???']=struct.unpack('26s',didson_data[58:84])
fileheader['idstring']=struct.unpack("33s",didson_data[84:117])
#fileheader['????2']=struct.unpack('235s',didson_data[117:352])
fileheader['framestart']=struct.unpack('i',didson_data[352:356])
fileheader['frameend']=struct.unpack('i',didson_data[356:360])
fileheader['timelapse']=struct.unpack('i',didson_data[360:364])
fileheader['recordInterval']=struct.unpack('i',didson_data[364:368])
fileheader['radioseconds']=struct.unpack('i',didson_data[368:372])
fileheader['frameinterval']=struct.unpack('i',didson_data[372:376])
return fileheader
def num_datagrams(didson_data):
assert(len(didson_data) % datagram_size==0)
return len(didson_data)/datagram_size
def get_offset(datagram_number):
return datagram_number * datagram_size
def didson_print(fileheader):
print fileheader
for key in fileheader:
print ' ',key, fileheader[key]
def main():
didson_file=open('C:/vprice/DIDSON/DIDSON Data/test.ddf', 'rb')
didson_data=didson_file.read()
print 'Number of datagrams:', num_datagrams(didson_data)
didson_print(datagram)
if __name__=='main':
main()
내가 "주"를 실행하면, 윌 한 줄씩 읽을 수 있습니까? 라인 당 하나의 값인지 확실하지 않습니다 ... 기본적으로 살펴보고 바이트 값을 계산하여 어떤 헤더 값이 어디에 있는지 파악했습니다.
도움이 될 것입니다!
'struct'는 문자열에서 데이터의 압축을 풉니 다. 그래서,'didson_data'는 문자열이어야합니다, 그러나 당신은 우리에게 파일로부터 그것을 읽는 코드를 보여주지 않았습니다. 파일에서 읽은 내용을 표시하지 않았으므로 표시 한 내용이 파일 위치를 변경해서는 안됩니다. 실제로 열린 파일에서 데이터를 읽으십니까? – steveha
내가 가진 건 didson_data = didson_file.read() ...이 일을하는 가장 좋은 방법은 무엇입니까 (나는 내가 초급자라고 말할 때 농담하지 않는다 ... 나는 약간의 MATLAB 경험을 가지고 있지만, 그게 전부이다.)? 내가 fileheader를 인쇄 할 때, 그것이 의미하는 바라면 모든 올바른 매개 변수를 얻습니다. –
'didson_file.read()'는 파일의 전체 내용을 메모리의 단일 문자열 변수로 슬쩍 할 것입니다. 그렇게하면 더 이상 찾을 필요가 없습니다. 당신은 그 문자열에 색인을하여 데이터를 가져올 수 있습니다. 또는 파일 데이터가 2 진수가 아니고 합리적인 선을 사용하는 경우 표준 Python 관용어를 사용할 수 있습니다 ... erm, 코드는 이러한 주석에 좋지 않습니다. 답변을 게시해야합니다. 제 대답을보세요. – steveha