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

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

7 Solutions collect form web for “Как определить размер открытого файла в Python?”

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

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 , 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 

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

 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 

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

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

Подобно тому, что вы получаете с помощью функции ftell () C или Stream.Position в .NET.

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

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

Хотя это старый вопрос, я думаю, что Исак имеет самое простое решение. Вот как это сделать в 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 

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

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

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

Это так много байтов файла.

  • объединить фоновый аудиофайл
  • Использование Python и libgpod (gtkpod) для загрузки музыки на iPod из Linux
  • Разный, чтобы получить выход между?
  • Запустить скрипт в переднем плане на загрузочной малине Pi
  • Почему бы просто не использовать `shell = True` в subprocess.Popen в Python?
  • Сервер Django часто убивали
  • Как получить доступ к ключам или значениям Python GDB Value
  • Не удается получить переменные среды в файле настроек Django
  • Почему простое эхо в подпроцессе не работает
  • Скопируйте данные из буфера обмена в Linux, Mac и Windows с помощью одного скрипта Python
  • Как вы проверяете Linux с Python, если процесс все еще запущен?
  • Python - лучший язык программирования в мире.