我定期从文件中读取16位帧, 最后一帧我需要知道是否有足够的数据和文件对我的格式有效。
f.read(16)
如果没有更多数据,返回空字符串;如果至少有1个字节,则返回数据。 如何查看文件中剩余的未读字节数?
答案 0 :(得分:7)
为此,您必须知道文件的大小。使用file对象,您可以执行以下操作:
f.seek(0, 2)
file_size = f.tell()
变量file_size
将包含文件的大小(以字节为单位)。在阅读时,只需执行f.tell() - file_size
即可获得剩余的字节数。所以:
答案 1 :(得分:2)
使用seek(0, 2)
和tell()
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 Reference:
seek(offset[, whence])
设置文件的当前位置,如stdio的fseek()。 whence参数是可选的,默认为0 (绝对文件定位);其他值为1(寻求相对于 当前位置)和2(寻找相对于文件的结尾)。没有 回报价值。请注意,如果打开文件进行追加(模式'a' 或'a +'),任何seek()操作将在下一次写入时撤消。如果 该文件仅在追加模式(模式'a')中打开,这个 method本质上是一个无操作,但它对于打开的文件仍然有用 在启用读取的附加模式下(模式'a +')。如果文件已打开 在文本模式下(没有'b'),只有tell()返回的偏移是合法的。 使用其他偏移会导致未定义的行为。请注意,并非所有文件 对象是可以寻找的。 p>
tell()
返回文件的当前位置,如stdio的ftell()。
答案 2 :(得分:1)
也许更容易使用..
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)