2011-10-12 2 views
1

내가 파일에서 주기적으로 16 비트 프레임을 읽고, 내가 충분한 데이터와 파일이 있는지 알 필요가 마지막 프레임 내 형식에 유효합니다.파일에 몇 개의 읽지 않은 바이트가 남아 있습니까?

f.read(16) 

더 많은 데이터가 없으면 빈 문자열을 반환하고 1 바이트 이상이면 데이터를 반환합니다. 읽지 않은 바이트가 파일에 남아 있는지 확인하려면 어떻게합니까?

+3

이유는 단순히'f.read (16)'에 의해 반환 된 문자열의 길이를 확인? 16 인 경우, 잘 사용하고, 16보다 작 으면 충분한 데이터가 남아 있지 않습니다. –

+1

파일 크기를 확인하기 전에 파일 크기를 확인하는 것은 어떻습니까? :'os.path.getsize (filename)' –

답변

7

는 들어, 파일의 크기를 알고해야 할 것이다. file 객체를 사용하면 다음 작업을 수행 할 수 있습니다 :

f.seek(0, 2) 
file_size = f.tell() 

변수 file_size 다음 바이트 파일의 크기가 포함됩니다. 읽는 동안 남은 바이트 수를 얻으려면 f.tell() - file_size을 입력하기 만하면됩니다. 그래서 :

2

사용 seek(0, 2)

BUFF = 16 
f = open("someFile", "r") 
x = 0 
# move to end of file 
f.seek(0, 2) 

# get current position 
eof = f.tell() 

# go back to start of file 
f.seek(0, 0) 

# some arbitrary loop 
while x < 128: 
    data = f.read(BUFF) 
    x += len(data) 

# print how many unread bytes left 
unread = eof - x 
print unread 

File Objects - Python Library Referencetell() :

  • seek(offset[, whence])는 표준 입출력의 fseek과 같은 파일의 현재 위치를 설정합니다(). whence 인수는 선택 사항이며 기본값은 0 (절대 파일 위치 지정)입니다. 다른 값은 1과 2 (파일의 끝에 대하여 추구)합니다 ( 현재 위치에 대하여 탐색)이다. 반환 값이 없습니다. 파일을 추가 (모드 'a' 또는 'a +')하기 위해 열면 seek() 연산은 다음 쓰기 작업에서 실행 취소됩니다. 경우 파일은이 방법은 본질적으로 아무 조합입니다, 추가 모드 (모드 '는')를 작성하기위한 열립니다하지만 읽기 (모드 'A +')을 사용하여 파일을 추가 모드에 을 열어 유용 남아있다. 파일이 (b없이) 텍스트 모드에서 으로 열리면 tell()에 의해 반환 된 오프셋 만 유효합니다. 다른 오프셋을 사용하면 정의되지 않은 동작이 발생합니다. 모든 파일 이 검색 가능한 것은 아닙니다.

  • 는 표준 입출력의 ftell은 같은 파일의 현재 위치를 돌려줍니다 tell()().

1

아마도 조금 easiser 사용하기 ..

def LengthOfFile(f): 
    """ Get the length of the file for a regular file (not a device file)""" 
    currentPos=f.tell() 
    f.seek(0, 2)   # move to end of file 
    length = f.tell()  # get current position 
    f.seek(currentPos, 0) # go back to where we started 
    return length 

def BytesRemaining(f,f_len): 
    """ Get number of bytes left to read, where f_len is the length of the file (probably from f_len=LengthOfFile(f))""" 
    currentPos=f.tell() 
    return f_len-currentPos 

def BytesRemainingAndSize(f): 
    """ Get number of bytes left to read for a regular file (not a device file), returns a tuple of the bytes remaining and the total length of the file 
     If your code is going to be doing this alot then use LengthOfFile and BytesRemaining instead of this function 
    """ 
    currentPos=f.tell() 
    l=LengthOfFile(f) 
    return l-currentPos,l 


if __name__ == "__main__": 
    f=open("aFile.data",'r') 
    f_len=LengthOfFile(f) 
    print "f_len=",f_len 
    print "BytesRemaining=",BytesRemaining(f,f_len),"=",BytesRemainingAndSize(f) 
    f.read(1000) 
    print "BytesRemaining=",BytesRemaining(f,f_len),"=",BytesRemainingAndSize(f) 
관련 문제