Python 脚本-扫描当前目录和所有子目录并显示它们的大小。

目录

1.Python 代码实现

2.Python 代码解释(部分)

1. 模块导入

2. ANSI 颜色编码 

3. format_size 函数 

4.get_directory_size 函数 

5. scan_directory 函数 

6. display_progress 函数 

7. main 函数

3.运行脚本 

3.1 基本用法

3.2 使用详细模式


1.Python 代码实现

#!/usr/bin/env python3
"""
Script Name   : folder_size_improved.py
# Author        : XinFan
# Created       : 21 January 2025
# Version       : 1.0.1Description:This script scans the specified directory (or current directory if none provided)and all its subdirectories to calculate and display the total size in a human-readable format.It includes additional features such as progress display, optional verbose mode, and support formultiple directory inputs.Usage:python folder_size_improved.py [directory1] [directory2] ... [-v | --verbose]
"""import os
import sys
import argparse
import threading
import time
from pathlib import Path# ANSI escape codes for colored output
GREEN = "\033[92m"
RED = "\033[91m"
YELLOW = "\033[93m"
ENDC = "\033[0m"def format_size(size):"""Convert size in bytes to a human-readable format."""for unit in ["Bytes", "KB", "MB", "GB", "TB"]:if size < 1024:return f"{size:.2f} {unit}"size /= 1024return f"{size:.2f} PB"def get_directory_size(directory):"""Recursively calculate the size of the given directory."""total_size = 0for entry in os.scandir(directory):if entry.is_file():try:total_size += entry.stat().st_sizeexcept FileNotFoundError:# Handle cases where file is deleted during scanpasselif entry.is_dir():total_size += get_directory_size(entry.path)return total_sizedef scan_directory(directory, progress, lock):"""Scan the directory and update the progress."""size = get_directory_size(directory)with lock:progress[directory] = sizedef display_progress(progress, lock, total_dirs):"""Display progress of the scanning process."""while True:with lock:completed = sum(1 for size in progress.values() if size is not None)if completed >= total_dirs:breakprint(f"\rScanning directories: {completed}/{total_dirs}", end="")time.sleep(1)print()  # Move to next line after scanning is completedef main():# Set up argument parsingparser = argparse.ArgumentParser(description="Calculate the size of specified directories.")parser.add_argument('directories', nargs='*', default=[os.getcwd()],help='Directories to scan. Defaults to current directory if none provided.')parser.add_argument('-v', '--verbose', action='store_true',help='Enable verbose output.')args = parser.parse_args()directories = args.directoriesverbose = args.verboseif verbose:print(f"Scanning directories: {', '.join(directories)}")progress = {}lock = threading.Lock()threads = []total_dirs = len(directories)# Start progress display threadprogress_thread = threading.Thread(target=display_progress, args=(progress, lock, total_dirs))progress_thread.start()# Start scanning threadsfor directory in directories:if os.path.isdir(directory):thread = threading.Thread(target=scan_directory, args=(directory, progress, lock))thread.start()threads.append(thread)else:print(f"{RED}Error:{ENDC} '{directory}' is not a valid directory.")total_dirs -= 1  # Decrement total_dirs since this is not a valid directory# Wait for all scanning threads to finishfor thread in threads:thread.join()# Signal progress thread to finishwith lock:progress['__DONE__'] = Trueprogress_thread.join()# Calculate total sizetotal_size = sum(progress.values())# Display resultsprint(f"\n{GREEN}Total Size:{ENDC} {format_size(total_size)}")if verbose:for directory in directories:size = progress.get(directory, 0)print(f"  {directory}: {format_size(size)}")if __name__ == "__main__":main()

2.Python 代码解释(部分)

1. 模块导入

import os
import sys
import argparse
import threading
import time
from pathlib import Path
  • os:提供与操作系统交互的功能,特别是文件和目录操作。
  • sys:提供对解释器使用的一些变量和函数的访问,特别是用于获取命令行参数。
  • argparse:用于解析命令行参数,提供更强大的参数解析功能。
  • threading:用于创建和管理线程,实现并发处理。
  • time:提供时间相关的函数,例如 sleep
  • pathlib.Path:提供面向对象的路径操作方式,简化路径处理。

2. ANSI 颜色编码 

GREEN = "\033[92m"
RED = "\033[91m"
YELLOW = "\033[93m"
ENDC = "\033[0m"
  • 说明:定义 ANSI 转义码,用于在终端中输出彩色文本。
    • GREEN:绿色文本。
    • RED:红色文本。
    • YELLOW:黄色文本。
    • ENDC:重置文本颜色。

3. format_size 函数 

def format_size(size):"""Convert size in bytes to a human-readable format."""for unit in ["Bytes", "KB", "MB", "GB", "TB"]:if size < 1024:return f"{size:.2f} {unit}"size /= 1024return f"{size:.2f} PB"
  • 说明:将字节数转换为更易读的格式,例如 KB, MB, GB 等。
  • 参数
    • size:文件或目录的大小,以字节为单位。
  • 返回值:格式化后的字符串,例如 "1500.00 Bytes""1.46 KB""0.00 GB"
  • 逻辑
    • 遍历单位列表,从 Bytes 到 TB。
    • 如果当前大小小于 1024,则返回格式化后的字符串。
    • 否则,将大小除以 1024,继续检查下一个单位。

4.get_directory_size 函数 

def get_directory_size(directory):"""Recursively calculate the size of the given directory."""total_size = 0for entry in os.scandir(directory):if entry.is_file():try:total_size += entry.stat().st_sizeexcept FileNotFoundError:# Handle cases where file is deleted during scanpasselif entry.is_dir():total_size += get_directory_size(entry.path)return total_size
  • 说明:递归计算指定目录及其所有子目录的总大小。
  • 参数
    • directory:要扫描的目录路径。
  • 返回值:总大小,以字节为单位。
  • 逻辑
    • 使用 os.scandir 遍历目录内容。
    • 如果是文件,尝试获取文件大小并累加到 total_size
      • 如果文件在扫描过程中被删除,捕捉 FileNotFoundError 异常并跳过。
    • 如果是子目录,递归调用 get_directory_size 并累加其大小。

5. scan_directory 函数 

def scan_directory(directory, progress, lock):"""Scan the directory and update the progress."""size = get_directory_size(directory)with lock:progress[directory] = size
  • 说明:扫描指定目录并更新进度。
  • 参数
    • directory:要扫描的目录路径。
    • progress:一个字典,用于存储每个目录的大小。
    • lock:一个线程锁,用于同步对 progress 的访问。
  • 逻辑
    • 调用 get_directory_size 计算目录大小。
    • 使用 lock 确保对 progress 的线程安全更新。

6. display_progress 函数 

def display_progress(progress, lock, total_dirs):"""Display progress of the scanning process."""while True:with lock:completed = sum(1 for size in progress.values() if size is not None)if completed >= total_dirs:breakprint(f"\rScanning directories: {completed}/{total_dirs}", end="")time.sleep(1)print()  # Move to next line after scanning is complete
  • 说明:在终端中显示扫描进度。
  • 参数
    • progress:一个字典,存储每个目录的大小。
    • lock:一个线程锁,用于同步对 progress 的访问。
    • total_dirs:要扫描的目录总数。
  • 逻辑
    • 进入一个无限循环,每秒更新一次进度。
    • 使用 lock 获取当前完成的目录数量。
    • 如果完成的目录数量达到 total_dirs,则退出循环。
    • 使用 \r 回到行首,覆盖之前的输出。
    • 显示当前扫描进度,例如 "Scanning directories: 5/10"
    • 休眠 1 秒。

7main 函数

def main():# Set up argument parsingparser = argparse.ArgumentParser(description="Calculate the size of specified directories.")parser.add_argument('directories', nargs='*', default=[os.getcwd()],help='Directories to scan. Defaults to current directory if none provided.')parser.add_argument('-v', '--verbose', action='store_true',help='Enable verbose output.')args = parser.parse_args()directories = args.directoriesverbose = args.verboseif verbose:print(f"Scanning directories: {', '.join(directories)}")progress = {}lock = threading.Lock()threads = []total_dirs = len(directories)
  • 说明:主函数,设置命令行参数解析并初始化扫描过程。
  • 逻辑
    • 使用 argparse 设置命令行参数:
      • directories:位置参数,指定要扫描的目录。默认为当前工作目录。
      • -v, --verbose:可选参数,启用详细输出。
    • 获取用户输入的目录列表和详细模式标志。
    • 如果启用详细模式,打印要扫描的目录列表。
    • 初始化 progress 字典,用于存储每个目录的大小。
    • 初始化线程锁 lock
    • 初始化线程列表 threads
    • 获取要扫描的目录总数 total_dirs

3.运行脚本 

打开终端或命令提示符,导航到脚本所在的目录,然后运行以下命令:

python folder_size_improved.py [options] [directories]
3.1 基本用法
  • 扫描当前目录

    python folder_size_improved.py

这将扫描当前工作目录及其所有子目录,并显示总大小。

  • 扫描指定目录:        
    python folder_size_improved.py /path/to/directory

这将扫描指定的目录及其所有子目录。

  •  扫描多个目录
python folder_size_improved.py /path/to/dir1 /path/to/dir2 /path/to/dir3
3.2 使用详细模式

启用详细模式

python folder_size_improved.py -v

python folder_size_improved.py --verbose

这将显示每个目录的具体大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5248.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

ThinkPHP 8的多对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

可视化-numpy实现线性回归和梯度下降法

代码如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.patches import Patch# 生成二维输入数据 np.random.seed(0) X1 2 * np.random.rand(100, 1) # 第一个特征 X2 3 * np.random.rand(10…

python_在钉钉群@人员发送消息

python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南&#xff0c;适用于群机器人接收消息&#xff0c;处理完一系列的动作之后&#xff0c;将消息返回给发消息的人员&#xff0c;同时该人员。 需要在企微后台新建一个自建应用&#xff0c;在自建应用里…

递归练习六(普通练习11-15)

一、例题 1、有效数独 36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 2、填数独 37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 3、单词搜索 79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 4、黄金矿工 1219. 黄金矿工 - 力扣&#xff08;LeetCod…

【生产力工具】ChatGPT for Windows桌面版本安装教程

使用桌面版的ChatGPT目前可解决官方轻微降智的问题。 文章目录 准备安装步骤步骤 1: 更改系统区域设置步骤 2: 关闭系统代理&#xff08;如果你正在使用的话&#xff09;步骤 3: 启动EXE文件步骤 4: 完成安装 准备 下载并保存好 ChatGPT桌面版的EXE安装文件。 下载地址1&…

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…

E-Prime2实现List嵌套

用E-Prime实现一个简单的List嵌套&#xff0c;实验流程基于斯特鲁程序&#xff08;色词一致/不一致实验&#xff09;。 首先File-New&#xff0c;新建一个空白项目 此时生成流程如下 Experiment Object是实验中被用到的流程或者控件对象&#xff0c;SessionProc是总流程&#x…

JS宏进阶:正则表达式的使用

正则表达式&#xff0c;对于任何一门编程语言来说&#xff0c;都是一种非常强大的工具&#xff0c;主要用于搜索、编辑或操作文本和数据。因此&#xff0c;在JS中&#xff0c;也存在相应的对象new RegExp( )&#xff0c;在本章中&#xff0c;将详细介绍正则表达式在JS宏中的运用…

在 Kubernetes 上快速安装 KubeSphere v4.1.2

目录标题 安装文档配置repo安装使用插件 安装文档 在 Kubernetes 上快速安装 KubeSphere 配置repo export https_proxy10.10.x.x:7890 helm repo add stable https://charts.helm.sh/stable helm repo update安装 helm upgrade --install -n kubesphere-system --create-name…

细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录 一、停止模式基础知识 1、进入停止模式 2、停止模式的状态 3、退出停止模式 4、SysTick定时器的影响 二、停止模式应用示例 1、示例功能和CubeMX项目配置 &#xff08;1&#xff09;时钟 &#xff08;2&#xff09;RTC &#xff08;3&#xff09;ADC1 &#xf…

JavaScript学习笔记(1)

html 完成了架子&#xff0c; css 做了美化&#xff0c;但是网页是死的&#xff0c;我们需要给他注入灵魂&#xff0c;所以接下来我们需要学习 JavaScript&#xff0c;这门语言会让我们的页面能够和用户进行交互。 一、引入方式 1.内部脚本 将 JS 代码定义在 HTML 页面中 Jav…

【三维分割】Gaga:通过3D感知的 Memory Bank 分组任意高斯

文章目录 摘要一、引言二、主要方法2.1 3D-aware Memory Bank2.2 三维分割的渲染与下游应用 三、实验消融实验应用: Scene Manipulation 地址&#xff1a;https://www.gaga.gallery 标题&#xff1a;Gaga: Group Any Gaussians via 3D-aware Memory Bank 来源&#xff1a;加利福…

Day 14 卡玛笔记

这是基于代码随想录的每日打卡 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;r…

|Python新手小白中级教程|第三十章:日期与时间(入门)

文章目录 前言一、日期与时间的基本概念二、时间戳1.概念2.形成过程 三、Python的时间格式化符号四、时间元组1.时间元组&#xff1a;2.struct_time元组的属性 五、time库可以干什么总结 前言 大家好呀&#xff0c;BOBO仔回来啦。 说实话&#xff0c;这几天我们学习面向对象的…

代码随想录刷题day13|(链表篇)24.两两交换链表中的结点

目录 一、链表理论基础 二、思路及易错点 易错点 三、相关算法题目 四、错误代码分析 一、链表理论基础 代码随想录 (programmercarl.com) 二、思路及易错点 该题使用虚拟头结点正常进行模拟即可&#xff0c;有两个关键点&#xff0c;一是循环何时终止&#xff1f;终止…

PIC单片机设置bootloader程序和app程序地址方法

在调试bootloader和app程序的时候通常都需要设置程序的偏移地址&#xff0c;下面就总结一下使用MPLAB X IDE 设置程序地址的方法。 打开bootloader工程 工程上单击鼠标右键&#xff0c;选择Properties,打工工程属性窗口。 此时会打开项目属性对话框 左边类别选择XC8 Line…

51c大模型~合集105

我自己的原文哦~ https://blog.51cto.com/whaosoft/13101924 #刚刚&#xff0c;ChatGPT开始有了执行力&#xff01; 现在 AI 智能体可以 24*7 小时为你打工。 2025 刚过去了半个月&#xff0c;OpenAI 在智能体领域「开大」了。 今天&#xff0c;OpenAI 正在为 ChatGPT 推出…