сколько непрочитанных байтов осталось в файле? - PullRequest
2 голосов
/ 12 октября 2011

Я периодически читаю 16-битные кадры из файла, последний кадр, который мне нужно знать, достаточно ли данных и файл подходит для моего формата.

f.read(16)

возвращает пустую строку, если нетбольше данных больше или данных, если есть хотя бы 1 байт.Как я могу проверить, сколько непрочитанных байтов осталось в файле?

Ответы [ 3 ]

7 голосов
/ 12 октября 2011

Для этого вам нужно знать размер файла. Используя объект file , вы можете сделать следующее:

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

Переменная file_size будет содержать размер вашего файла в байтах. Во время чтения просто наберите f.tell() - file_size, чтобы узнать количество оставшихся байтов. Итак:

2 голосов
/ 12 октября 2011

Используйте 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

Файловые объекты - Справочник по библиотеке Python :

  • seek(offset[, whence]) Установите текущую позицию файла, как в stdio's fseek (). Аргумент wherece является необязательным и по умолчанию равен 0 (абсолютное позиционирование файла); другие значения равны 1 (ищите относительно текущая позиция) и 2 ( поиск относительно конца файла ). Здесь нет возвращаемое значение Обратите внимание, что если файл открыт для добавления (режим «а» или 'a +'), любые операции поиска () будут отменены при следующей записи. Если файл открывается только для записи в режиме добавления (режим «а»), это Метод по сути не работает, но он остается полезным для открытых файлов в режиме добавления с включенным чтением (режим «а +»). Если файл открыт в текстовом режиме (без 'b') допустимы только смещения, возвращаемые функцией tell (). Использование других смещений вызывает неопределенное поведение. Обратите внимание, что не все файлы объекты доступны для поиска.

  • tell() Возвращает текущую позицию файла, как в stdio's ftell ().

1 голос
/ 12 марта 2013

возможно немного проще в использовании ..

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...