使用python查看文件夹占用情况

"""
计算指定目录大小
"""
import os
import sys
import prettytable as pt
import pandas as pd

LONGEST_FILE_PATH = 100


def classify_file_directory(path):
    """
    返回指定path下第一层文件和文件夹绝对路径列表
    param:
        path 文件夹路径
    returns:
        file_list_full: 第一层的文件绝对路径列表
        directory_list_full: 第一层文件夹的绝对路径列表
        file_list_short: 第一层文件名列表
        directory_list_short: 第一层文件绝对路径列表
    """
    # 第一层文件和目录
    mixed_file_directory = os.listdir(path)

    file_list_full = []
    directory_list_full = []

    file_list_short = []
    directory_list_short = []

    for mix in mixed_file_directory:
        full_path = os.path.join(path, mix)
        if os.path.isfile(full_path):
            file_list_full.append(full_path)
            file_list_short.append(mix)
        elif os.path.isdir(full_path):
            directory_list_full.append(full_path)
            directory_list_short.append(mix)

    return file_list_full, directory_list_full, file_list_short, directory_list_short


def get_directory_size(path):
    """
    获取文件夹大小
    """
    sum_size = 0
    try:
        for root, dirs, files in os.walk(path):
            for f in files:
                full_path = os.path.join(root, f)
                full_path = u"\\\\?\\" + full_path
                # 过滤掉路径过长的文件
                if len(full_path) > LONGEST_FILE_PATH:
                    continue
                size = os.path.getsize(full_path)
                sum_size += size
        return sum_size
    except Exception as err:
        print(err)


def get_file_size(path):
    """
    获取文件大小
    """
    return os.path.getsize(path)


def format_size(size_in_byte):
    """
    格式化大小,以B,KB,MB,GB结尾
    params:
        size_in_byte 以B为单位的文件空间大小
    returns:
        格式化后的以B、KB、MB、GB为单位的空间大小
    """
    precision = 1
    if size_in_byte < 1024:
        return str(round(size_in_byte, precision)) + "B"
    elif size_in_byte < 1024 ** 2:
        return str(round(size_in_byte / 1024, precision)) + "KB"
    elif size_in_byte < 1024 ** 3:
        return str(round(size_in_byte / 1024 ** 2, precision)) + "MB"
    else:
        return str(round(size_in_byte / 1024 ** 3, precision)) + "GB"


def get_pretty_table(path):
    """
    拼装prettyTable
    """
    file_list_full, directory_list_full, file_list_short, directory_list_short = classify_file_directory(path)

    file_size_list = [get_file_size(filePath) for filePath in file_list_full]
    directory_size_list = [get_directory_size(directory_path) for directory_path in directory_list_full]

    whole_name_list = []
    whole_size_list = []

    whole_name_list.extend(directory_list_short)
    whole_name_list.extend(file_list_short)

    whole_size_list.extend(directory_size_list)
    whole_size_list.extend(file_size_list)

    file_size_data = {"name": whole_name_list, "size": whole_size_list}
    file_size_df = pd.DataFrame(file_size_data)
    file_size_df.sort_values(by="size", inplace=True, ascending=False)
    
    tb = pt.PrettyTable()
    tb.add_column("name", list(file_size_df['name']), align='l')
    formated_file_size = [format_size(file_size_byte) for file_size_byte in list(file_size_df['size'])]
    tb.add_column("size", formated_file_size, align='l')
    return tb


if __name__ == "__main__":
    """
    python directory_detail.py D:\
    """
    pretty_table = get_pretty_table(sys.argv[1])
    print(pretty_table)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值