Ответ 1
st = os.stat(…)
du = st.st_blocks * st.st_blksize
Как получить фактический размер файла на диске в python? (фактический размер, требуемый для жесткого диска).
Спасибо.
st = os.stat(…)
du = st.st_blocks * st.st_blksize
Только UNIX:
import os
from collections import namedtuple
_ntuple_diskusage = namedtuple('usage', 'total used free')
def disk_usage(path):
"""Return disk usage statistics about the given path.
Returned valus is a named tuple with attributes 'total', 'used' and
'free', which are the amount of total, used and free space, in bytes.
"""
st = os.statvfs(path)
free = st.f_bavail * st.f_frsize
total = st.f_blocks * st.f_frsize
used = (st.f_blocks - st.f_bfree) * st.f_frsize
return _ntuple_diskusage(total, used, free)
Использование:
>>> disk_usage('/')
usage(total=21378641920, used=7650934784, free=12641718272)
>>>
Изменить 1 - также для Windows: https://code.activestate.com/recipes/577972-disk-usage/?in=user-4178764
Изменить 2 - это также доступно в Python 3.3+: https://docs.python.org/3/library/shutil.html#shutil.disk_usage
Используйте os.stat(filename).st_size, чтобы получить логический размер файла. Используйте os.statvfs(filename).f_bsize, чтобы получить размер блока файловой системы. Затем используйте целочисленное деление для вычисления правильного размера на диске, как показано ниже:
lSize=os.stat(filename).st_size
bSize=os.statvfs(filename).f_bsize
sizeOnDisk=(lSize/bSize+1)*bSize
Я не уверен, что это размер на диске или логический размер:
import os
filename = "/home/tzhx/stuff.wev"
size = os.path.getsize(filename)
Если это не ваш дроид, который вы ищете, вы можете округлить его, разделив его на размер кластера (как float), затем используя ceil, затем умножая.
Чтобы получить использование диска для данного файла/папки, вы можете сделать следующее:
import os
def disk_usage(path):
"""Return cumulative number of bytes for a given path."""
# get total usage of current path
total = os.path.getsize(path)
# if path is dir, collect children
if os.path.isdir(path):
for file_name in os.listdir(path):
child = os.path.join(path, file_name)
# recursively get byte use for children
total += disk_usage(child)
return total
Функция рекурсивно собирает использование байтов для файлов, вложенных в заданный путь, и возвращает кумулятивное использование для всего пути.
Вы также можете добавить print "{path}: {bytes}".format(path, total)
, если хотите, чтобы информация для каждого файла печаталась.