Прежде чем я заново изобрел этот конкретный круг, есть ли у кого-нибудь хорошая процедура для расчета размера каталога с использованием Python? Было бы очень хорошо, если бы подпрограмма хорошо форматировала размер в Мб / Гб и т. Д.
182
tree
в системах * nix делает все это бесплатно.tree -h -d --du /path/to/dir
,du -sh /path/to/dir/*
Ответы:
Это идет по всем подкаталогам; суммирование размеров файлов:
И еще один интересный способ использования os.listdir ( не включает подкаталоги ):
Ссылка:
Обновлено Для использования os.path.getsize это более понятно , чем использование метода os.stat (). St_size.
Спасибо ghostdog74 за указание на это!
os.stat - st_size Дает размер в байтах. Может также использоваться для получения размера файла и другой информации, связанной с файлом.
Обновление 2018
Если вы используете Python 3.4 или более раннюю версию, вы можете рассмотреть возможность использования более эффективного
walk
метода, предоставляемого стороннимscandir
пакетом. В Python 3.5 и более поздних версиях этот пакет был включен в стандартную библиотеку иos.walk
получил соответствующее увеличение производительности.Обновление 2019
В последнее время я использую
pathlib
все больше и больше, вотpathlib
решение:источник
st_size
если вы хотите не следовать символическим ссылкам, как вы должны затем использоватьlstat
.Некоторые из предложенных подходов реализуют рекурсию, другие используют оболочку или не будут давать аккуратно отформатированные результаты. Когда ваш код является одноразовым для платформ Linux, вы можете получить обычное форматирование, включая рекурсию, в виде одной строки. За исключением
print
последней строки, она будет работать для текущих версийpython2
иpython3
:прост, эффективен и будет работать с файлами и многоуровневыми каталогами:
источник
Вот рекурсивная функция (она рекурсивно суммирует размер всех подпапок и их соответствующих файлов), которая возвращает точно такие же байты, что и при запуске du -sb. в Linux (где «.» означает «текущая папка»):
источник
Рекурсивный размер папки Python 3.5 с использованием
os.scandir
источник
sum([entry.stat().st_size for entry in os.scandir(file)])
. Примечание выводится в байтах, / 1024 для получения КБ и / (1024 * 1024) для получения МБ.sum(entry.stat().st_size for entry in os.scandir(file))
. Нет причин составлять список, потому чтоsum
принимает итераторы.Ответ monknut хорош, но он не работает на битой символической ссылке, поэтому вам также нужно проверить, действительно ли существует этот путь
источник
lstat
.Принятый ответ не учитывает жесткие или программные ссылки и будет учитывать эти файлы дважды. Вы хотите отслеживать, какие inode вы видели, а не добавлять размер для этих файлов.
источник
os.lstat
(а неos.stat
), чтобы избежать следующих символических ссылок: docs.python.org/2/library/os.html#os.lstatОтвет Криса хорош, но его можно сделать более идиоматичным, если использовать набор для проверки видимых каталогов, что также позволяет избежать использования исключения для потока управления:
источник
df -sb
.рекурсивный однострочник:
источник
Для второй части вопроса
источник
Используя
pathlib
эту строку, я получил размер одной папки:И вот что я придумал для красиво отформатированного вывода:
Использование:
Я также сталкивался с этим вопросом , в котором есть несколько более компактных и, вероятно, более производительных стратегий для печати размеров файлов.
источник
Вы можете сделать что-то вроде этого:
в этом случае я не проверял результат перед его возвратом, при желании вы можете проверить его с помощью command.getstatusoutput.
источник
os.walk
рекурсивной проверкой размера подпапки?Вы говорите, один вкладыш ... Вот один вкладыш:
Хотя я, вероятно, разделил бы это, и это не выполняет никаких проверок.
Чтобы преобразовать в КБ, см. Многоразовую библиотеку, чтобы получить читаемую человеком версию размера файла? и работать в
источник
Немного опоздал на вечеринку, но в одной строке при условии, что у вас установлен glob2 и humanize . Обратите внимание, что в Python 3 по умолчанию
iglob
используется рекурсивный режим. Как изменить код для Python 3 оставлено в качестве тривиального упражнения для читателя.источник
glob
поддерживает рекурсию. Вы можете использовать:glob.glob('/var/**', recursive=True)
Следующий скрипт печатает размер каталога всех подкаталогов для указанного каталога. Он также пытается извлечь выгоду (если возможно) из кэширования вызовов рекурсивных функций. Если аргумент опущен, скрипт будет работать в текущем каталоге. Вывод сортируется по размеру каталога от самого большого до самого маленького. Таким образом, вы можете адаптировать его для своих нужд.
PS Я использовал рецепт 578019 для отображения размера каталога в удобном для человека формате ( http://code.activestate.com/recipes/578019/ )
Пример вывода:
РЕДАКТИРОВАТЬ: перемещен null_decorator выше, как рекомендуется пользователем 2233949
источник
используйте библиотеку sh : модуль
du
делает это:если вы хотите передать звездочку, используйте,
glob
как описано здесь .чтобы преобразовать значения в удобочитаемые, используйте humanize :
источник
для получения размера одного файла есть os.path.getsize ()
сообщается в байтах.
источник
Для чего это стоит ... команда дерева делает все это бесплатно:
Я люблю Python, но самое простое решение проблемы не требует нового кода.
источник
Это удобно:
источник
Я использую Python 2.7.13 с Scandir, и вот моя однострочная рекурсивная функция для получения общего размера папки:
https://pypi.python.org/pypi/scandir
источник
Когда размер подкаталогов вычислен, он должен обновить размер папки своего родителя, и это будет продолжаться, пока не достигнет корневого родителя.
Следующая функция вычисляет размер папки и всех ее подпапок.
источник
Если вы находитесь в ОС Windows, вы можете сделать:
установите модуль pywin32, запустив:
pip install pywin32
а затем кодировать следующее:
источник
Вот одна строка, которая делает это рекурсивно (рекурсивная опция доступна в Python 3.5):
источник
для python3.5 +
источник
Этот скрипт сообщает вам, какой файл является самым большим в CWD, а также сообщает, в какой папке находится файл. Этот скрипт у меня работает на win8 и python 3.3.3 shell
источник
По общему признанию, это отчасти хакерское и работает только на Unix / Linux.
Это соответствует,
du -sb .
потому что в действительности это оболочка Python bash, которая запускаетdu -sb .
команду.источник
Я немного опоздал (и новичок) здесь, но я решил использовать модуль подпроцесса и командную строку 'du' в Linux, чтобы получить точное значение размера папки в МБ. Мне пришлось использовать if и elif для корневой папки, потому что в противном случае подпроцесс вызывает ошибку из-за ненулевого возвращаемого значения.
источник
Получить размер каталога
Свойства раствора:
du
делаетst.st_blocks
для используемого дискового пространства, таким образом, работает только на Unix-подобных системахКод:
Пример использования:
Удобочитаемый размер файла
Свойства раствора:
Код:
Пример использования:
источник
Решение, которое работает на Python 3.6 с использованием pathlib.
источник
Рекурсивная папка / размер файла Python 3.6+ с использованием
os.scandir
. Как мощный , как в ответ по @blakev, но короче и в ЭСПЦ стиле питона .источник
Я написал эту функцию, которая дает мне точный общий размер каталога, я пробовал другие решения для циклов с os.walk, но я не знаю, почему конечный результат всегда был меньше, чем фактический размер (в Ubuntu 18 env). Должно быть, я сделал что-то не так, но кого это волнует, написал, что этот работает отлично.
источник