Вычислить размер каталога с помощью 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! Это работает действительно хорошо!