2011-11-15 2 views
1

포틀란 프로그램에서 포맷되지 않은 파일을 생성하고 파이썬으로 읽으려고합니다.fortran unformatted file with python

나는 첫 번째 "청크"가 character*1 name(80)의 문자 배열 인 것을 알고 있으므로 소스 코드를 가지고 있습니다. 그래서 나는 밖으로 시작합니다

f = open(filename,'rb') 
bytes = 80 
name = struct.unpack('c'*bytes,f.read(bytes)) 

name은 길이가 1 인 문자열로 구성된 80 길이 튜플입니다. 일부 내용은 16 진수 문자열 (예 : \x00)입니다. 이 변수를 단일 ASCII 문자열로 변환하는 방법은 무엇입니까?

+0

나는'rb '대신'open (filename,'r ')'을 사용해야한다고 생각한다. – hatmatrix

답변

6

대부분의 Fortran 포맷되지 않은 파일에는 레코드의 길이를 지정하는 추가 바이트가 포함됩니다. 레코드는 단일 포트란 작성 문으로 작성된 항목 그룹입니다. 일반적으로 각 레코드의 시작과 끝에 4 바이트. 따라서 다른 언어에서는이 "숨겨진"값을 읽고 건너 뛰고 싶을 것입니다. 이 경우 문자열의 일부로 해석하려고하면 문자열에 잘못된 값이 추가되어 ASCII에 대한 고유 한 값을 갖게됩니다.

Fortran 문자열은 길이가 고정되고 끝에 0x20의 공백이 채워집니다. 문자열이 초기화되지 않았거나 Fortran 프로그래머가 문자열을 사용하여 이진 데이터를 보관하지 않는 한 0x00 값을 기대하지 않습니다.

이 시대에는 Fortran 프로그래머가 다른 언어와 함께 사용하기위한 서식없는/2 진 파일을 작성하는 경우 Fortran 2003의 "stream"IO 메소드를 사용하여 이러한 추가 바이트를 생략 할 수 있습니다.

+0

이것은 매우 도움이되었습니다. 감사합니다. – hatmatrix

+0

이 파일을 작성한 Fortran 소스 코드에 액세스 할 수 있다면 쉽게 확인할 수 있습니다. 순차 I/O (기본값)를 사용하는 경우 레코드 머리글/바닥 글이 지정되어있는 경우 직접 액세스로는 그렇지 않습니다. 파일 크기를 살펴보고 포함 된 내용을 기반으로 "예상"크기를 계산할 수도 있습니다. 크기가 크고 모든 것을 얻은 것이라면이 레코드 머리글/바닥 글의 결과 일 가능성이 큽니다. –

2

먼저 올바른 형식 지정자를 사용하고 NUL을 제거하십시오.

>>> struct.unpack('%ds' % 20, 'Hello, World!' + '\x00' * 7) 
('Hello, World!\x00\x00\x00\x00\x00\x00\x00',) 
>>> struct.unpack('%ds' % 20, 'Hello, World!' + '\x00' * 7)[0].rstrip('\x00') 
'Hello, World!' 
+0

아,이 지정어를 사용할 수 있다는 것을 알지 못했습니다. 나는'\ x00'이 NULL이라는 것을 알지만'\ xa0','@ \ x08 등과 같은 다른 문자열도 있습니다 ... 거기에 16 진수 -> ascii 변환기가 있습니까? 나는 주변을 둘러 보았고, 내가 우연히 만났던 것이 이상하다는 것을 알았다. – hatmatrix

+0

\ x80 아래에 이미 ASCII입니다. 아마도 당신은 더 해독 할 필요가 있거나, 당신이 다른 캐릭터 세트를보고 있다고 결정할 것입니다. –

+0

그럴 수도 있습니다. 감사. – hatmatrix