Как определить размер открытого файла в Python?

Там файл, который я хотел бы убедиться, не превышает 2 ГБ (как он должен работать в системе, использующей ext 2). Какой хороший способ проверить размер файла, имея в виду, что я буду писать этот файл между проверками? В частности, мне нужно беспокоиться о буферизованных, незапланированных изменениях, которые еще не были записаны на диск?

Ответ 1

Вы можете начать с чего-то вроде этого:

class TrackedFile(file):
    def __init__(self, filename, mode):
        self.size = 0
        super(TrackedFile, self).__init__(filename, mode)
    def write(self, s):
        self.size += len(s)
        super(TrackedFile, self).write(s)

Затем вы можете использовать его следующим образом:

>>> f = TrackedFile('palindrome.txt', 'w')
>>> f.size
0
>>> f.write('A man a plan a canal ')
>>> f.size
21
>>> f.write('Panama')
27

Очевидно, что эта реализация не работает, если вы не пишете файл с нуля, но вы можете адаптировать ваш метод __init__ для обработки исходных данных. Вам также может потребоваться переопределить некоторые другие методы: writelines, например.

Это работает независимо от кодировки, поскольку строки - это просто последовательности байтов.

>>> f2 = TrackedFile('palindrome-latin1.txt', 'w')
>>> f2.write(u'A man a plan a canál '.encode('latin1')
>>> f3 = TrackedFile('palindrome-utf8.txt', 'w')
>>> f3.write(u'A man a plan a canál '.encode('utf-8'))
>>> f2.size
21
>>> f3.size
22

Ответ 2

Возможно, не то, что вы хотите, но я все равно предлагаю.

import os
a = os.path.getsize("C:/TestFolder/Input/1.avi")

В качестве альтернативы для открытого файла вы можете использовать функцию fstat, которая может быть использована в открытом файле. Он принимает целочисленный дескриптор файла, а не объект файла, поэтому вам нужно использовать метод fileno для файлового объекта:

a = open("C:/TestFolder/Input/1.avi")
b = os.fstat(a.fileno()).st_size

Ответ 3

os.fstat(file_obj.fileno()).st_size должен сделать трюк. Я думаю, что он вернет записанные байты. Вы всегда можете сделать флеш перед рукой, если вас беспокоит буферизация.

Ответ 4

Я не знаком с python, но не имеет ли объект потока (или что-то, что вы получаете при открытии файла), свойство, которое содержит текущую позицию потока?

Подобно тому, что вы получаете с ftell(), или Stream.Position в .NET.

Очевидно, что это работает только в том случае, если вы находитесь в конце потока, который вы, если вы в настоящее время пишете на него.

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

Ответ 5

Хотя это старый вопрос, я думаю, что Isak имеет самое простое решение. Вот как это сделать в Python:

# Assuming f is an open file
>>> pos = f.tell()  # Save the current position
>>> f.seek(0, 2)  # Seek to the end of the file
>>> length = f.tell()  # The current position is the length
>>> f.seek(pos)  # Return to the saved position
>>> print length
1024

Ответ 6

Наиболее надежным было бы создание класса упаковки, который бы проверял размер файла при его открытии, отслеживать операции записи и поиска, подсчитывать текущий размер на основе этих операций и предотвращать превышение ограничения по размеру.

Ответ 7

Или, если файл уже открыт:

>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444

Это количество байтов файла.