Получить фактическое дисковое пространство

Как получить фактический размер файла на диске в python? (фактический размер, требуемый для жесткого диска).

Спасибо.

Ответы

Ответ 1

st = os.stat(…)
du = st.st_blocks * st.st_blksize

Ответ 2

Только 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

Ответ 3

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

Ответ 4

Я не уверен, что это размер на диске или логический размер:

import os
filename = "/home/tzhx/stuff.wev"
size = os.path.getsize(filename)

Если это не ваш дроид, который вы ищете, вы можете округлить его, разделив его на размер кластера (как float), затем используя ceil, затем умножая.

Ответ 5

Чтобы получить использование диска для данного файла/папки, вы можете сделать следующее:

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), если хотите, чтобы информация для каждого файла печаталась.