【问题标题】:Python: List Directories and SizesPython:列出目录和大小
【发布时间】:2011-04-15 17:15:27
【问题描述】:

我正在尝试编写一些 Python 代码,它将遍历当前工作目录中的每个目录并报告每个目录下的总大小(以字节为单位),而不管每个目录本身有多深。

这只是一个学习项目,我意识到已经有其他方法可以通过 shell 获取这些信息。这是我到目前为止的一些代码:

# 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

【问题讨论】:

    标签: python directory size


    【解决方案1】:

    这将列出给定目录中目录的大小,加上总数:

    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】:

    你应该看看os.path.walk

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 2014-07-16
      • 2011-02-23
      • 2012-10-28
      • 2010-11-04
      • 2011-01-26
      • 2012-06-16
      • 1970-01-01
      相关资源
      最近更新 更多