Там файл, который я хотел бы убедиться, не превышает 2 ГБ (как он должен работать в системе, использующей ext 2). Какой хороший способ проверить размер файла, имея в виду, что я буду писать этот файл между проверками? В частности, мне нужно беспокоиться о буферизованных, незапланированных изменениях, которые еще не были записаны на диск?
Как определить размер открытого файла в Python?
Ответ 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
Это количество байтов файла.