2013-07-30 7 views
0

바이너리 인코딩 된 32 비트 정수 파일을 읽고 적절하게 구문 분석하는 matlab의 스크립트를 번역 중입니다.예기치 않게 파일 읽기가 끝납니다.

def readi(f,n):   
    x = zeros(n,int);  
    for i in range(0,n): 
     x[i] = struct.unpack('i',f.read(4))[0]; 
     print x[i]; 
    return x; 

내가 데이터를 구문 분석으로 내 스크립트에 1에서 9까지의 N로 다양하게이 함수를 호출 : 나는 MATLAB의 FREAD() 함수를 모방하고자하는 다음과 같은 방법을 작성했습니다.

x[i] = struct.unpack('i',f.read(4))[0]; 
struct.error: unpack requires a string argument of length 4 

파이썬 내가 파일의 끝에 도달 생각하는 것으로 나타납니다 내 문제는 내가이 오류가 발생하기 전에 스크립트는 파일에 방법의 일부를 얻을 수 있다는 것입니다. 오류가 발생하는 실행 지점은 이미 여러 번 반복 된 루프의 줄입니다. 또한, 파싱 된 파일의 작은 부분은 이미 내 MATLAB 스크립트가 정확히 동일한 파일 (사본이 아님)에서 생성 된 것과 정확히 일치합니다. 그러나 Matlab은 파일에서 훨씬 더 큰 데이터 세트를 읽을 수 있습니다. 누구든지이 오류가 발생하는 이유에 대한 아이디어가 있습니까?

+0

파일 개체를 여는 코드를 표시하십시오. 바이너리 모드가 아닌 텍스트 모드로 열리고 있습니까? – agf

+0

여기서 하나의 큰 버그는 입력 값의 엔디안을 정의하지 않는다는 것입니다. 또 다른 것은 struct 모듈이 필요한 바이트 수를 알려주고 오류를 피하기 위해 해당 정보를 사용한다는 것입니다. –

+0

struct.error를 잡아 내고 f.tell()을 출력하여 정상 성을 검사 할 수 있습니다. 파일의 크기가 인쇄되면 문제가이 코드와 다르다는 것을 알 수 있습니다. – tdelaney

답변

0

파일 자체가 바이너리 모드로 열렸는지 아닌지는 놀랍지 만 문제가되지 않았습니다. 내가 제안 할 수있는 유일한 방법은 입력 파일 의 형식을 정확히으로 이해하는 것입니다. 따라서 matlab 스크립트를 읽는 것 외에도 원시 데이터의 개별 바이트를 볼 수있는 파일의 16 진 덤프를보고 해당 내용의 레이아웃에 대한 사용자의 이해와 일치하는지 확인할 수있는 것이 좋습니다.

모든 게다가, 당신은 임시 x 목록을 필요로 그룹의 모든 정수의 바이트를 읽어하지 않는 readi() 함수의 다음 단순화/최적화를 시도 할 수 하나의 호출 file.read()에 :

def readi(f, n): 
    fmt = '%di' % n 
    return struct.unpack(fmt, f.read(struct.calcsize(fmt))) 

그러나 나는 당신의 문제를 해결할 것이라고 생각하지 않는다. 왜냐하면 그것은 당신이 이미하고있는 것과 동등해야하고, 어쨌든 가치 현명을 돌려 준다.

마지막으로 한 줄을 - 코드 줄을 세미콜론으로 끝내지 않아도됩니다. 파이썬은 그 점에서 C와 다른 여러 언어와 다르다.

+0

좋은 조언. 바이너리로 열어서 고칠 수있었습니다. readi 기능을 단순화 해 주셔서 감사합니다. 한 줄짜리 접근법이 있다고 확신했지만, 그것을 이해할 수는 없었습니다. – kjgregory

+0

예, 바이너리 모드로 파일을 읽는 것이 합리적입니다. 그래서 내가 제한된 테스트에서 중요하지 않은 것처럼 보였던 것에 놀랐습니다. 또한 내 대답에'readi()'함수에 약간의 수정/개선 사항을 주었다. – martineau

관련 문제