Python: список каталогов и размеров - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь написать некоторый код Python, который будет проходить по каждому каталогу в текущем рабочем каталоге и сообщать об общем размере (в байтах) под каждым каталогом, независимо от глубины самого каталога.

Это только для учебного проекта, я понимаю, что уже есть другие способы получить эту информацию через оболочку.Вот некоторый код, который у меня есть:

# get name of current working directory
start_directory = os.getcwd()

# create dictionary to hold the size of each folder in 
# the current working directory
top_level_directory_sizes = {}

# initialize directory
for i in os.listdir(start_directory):
    if os.path.isdir(i):
        top_level_directory_sizes[i] = 0

# traverse all paths from current working directory
for dirpath, dirnames, filenames in os.walk(start_directory):

    for f in filenames:
        fp = os.path.join(dirpath, f)
        #increment appropriate dictionary element: += os.path.getsize(fp)

for k,v in top_level_directory_sizes.iteritems():
    print k, v

Таким образом, мы надеемся, что результат будет выглядеть примерно так:

algorithms    23,754 bytes
articles       1,234 bytes
books        123,232 bytes
images        78,232 bytes

total        226,452 bytes

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Это будет список размеров каталогов в данном каталоге, а также общее количество:

import locale
import os

locale.setlocale(locale.LC_ALL, "")

def get_size(state, root, names):
    paths = [os.path.realpath(os.path.join(root, n)) for n in names]
    # handles dangling symlinks
    state[0] += sum(os.stat(p).st_size for p in paths if os.path.exists(p))

def print_sizes(root):
    total = 0
    paths = []
    state = [0]
    n_ind = s_ind = 0
    for name in sorted(os.listdir(root)):
        path = os.path.join(root, name)
        if not os.path.isdir(path):
            continue

        state[0] = 0
        os.path.walk(path, get_size, state)
        total += state[0]
        s_size = locale.format('%8.0f', state[0], 3)
        n_ind = max(n_ind, len(name), 5)
        s_ind = max(s_ind, len(s_size))
        paths.append((name, s_size))

    for name, size in paths:
        print name.ljust(n_ind), size.rjust(s_ind), 'bytes'
    s_total = locale.format('%8.0f', total, 3)
    print '\ntotal'.ljust(n_ind), s_total.rjust(s_ind), 'bytes'

print_sizes('.')

Вывод:

% python dirsizes.py
bar    102,672 bytes
foo    102,400 bytes

total  205,072 bytes
2 голосов
/ 15 апреля 2011

Вы должны посмотреть на os.path.walk.

...