Вычислить размер каталога с помощью Python?

Прежде чем я заново изобрел этот конкретный круг, есть ли у кого-нибудь хорошая процедура для расчета размера каталога с использованием Python? Было бы очень хорошо, если бы подпрограмма хорошо форматировала размер в Мб / Гб и т. Д.

35 ответов

Этот возвращает то же количество байтов, что иdu -sbкоманда в Linux:

  • Он добавляет размеры файлов для уникальных индексных дескрипторов (для обработки жестких ссылок).
  • Он используетos.lstatкоторый не следует по символическим ссылкам.
  • Он принимает во внимание верхний каталог.
      import os

def du(directory):
    # add size of the top directory (special file)
    size=os.lstat(directory).st_size

    inodes_sizes={}
    for dirpath, dirnames, filenames in os.walk(directory):
        # add sizes of subdirectories (special files)
        for d in dirnames:            
            size+=os.lstat(os.path.join(dirpath, d)).st_size
        # get sizes for unique inodes (to include all hard links to a single file once)            
        for f in filenames:            
            file_stat=os.lstat(os.path.join(dirpath, f))
            inode=file_stat.st_ino
            inode_size=file_stat.st_size
            inodes_sizes[inode]=inode_size   

    # add sizes of files
    size+=sum(inodes_sizes.values())
    return(size)

По общему признанию, это отчасти хакерское и работает только на Unix/Linux.

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

import subprocess

def system_command(cmd):
    """"Function executes cmd parameter as a bash command."""
    p = subprocess.Popen(cmd,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         shell=True)
    stdout, stderr = p.communicate()
    return stdout, stderr

size = int(system_command('du -sb . ')[0].split()[0])

Я немного опоздал (и новичок) здесь, но я решил использовать модуль подпроцесса и командную строку 'du' с Linux, чтобы получить точное значение для размера папки в МБ. Мне пришлось использовать if и elif для корневой папки, потому что в противном случае подпроцесс вызывает ошибку из-за ненулевого возвращаемого значения.

import subprocess
import os

#
# get folder size
#
def get_size(self, path):
    if os.path.exists(path) and path != '/':
        cmd = str(subprocess.check_output(['sudo', 'du', '-s', path])).\
            replace('b\'', '').replace('\'', '').split('\\t')[0]
        return float(cmd) / 1000000
    elif os.path.exists(path) and path == '/':
        cmd = str(subprocess.getoutput(['sudo du -s /'])). \
            replace('b\'', '').replace('\'', '').split('\n')
        val = cmd[len(cmd) - 1].replace('/', '').replace(' ', '')
        return float(val) / 1000000
    else: raise ValueError

Вызовите эту функцию, чтобы получить размер файла

import os
import humanize
def size(filepath):
    in_byte = os.path.getsize(filepath)
    print( f'Size:    {humanize.naturalsize(in_byte)}' )
size('/content/drive/My Drive/forgery_detection/pristine_data.pb')

Выход:

Размер: 2,1 ГБ

import os

def get_size(path):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(path):
        for f in filenames:
            if os.path.exists(fp):
                fp = os.path.join(dirpath, f)
                total_size += os.path.getsize(fp)

    return total_size   # in megabytes

Спасибо, Monkut & Troex! Это работает действительно хорошо!

Другие вопросы по тегам