【笔记】计算文件夹的大小
目标:遍历文件夹,计算文件夹下包含文件和文件夹的大小。将这些结果存入python自带的数据库。
用大模型帮我设计并实现。
Step1 创建一个测试用的目录结构
创建目录结构如下所示:
TestDirectory/
│
├── EmptyFolder/
│
├── SmallFiles/
│ ├── file1.txt (1 KB)
│ ├── file2.txt (2 KB)
│ └── file3.txt (3 KB)
│
├── LargeFiles/
│ ├── big_file1.bin (10 MB)
│ ├── big_file2.bin (20 MB)
│ └── big_file3.bin (30 MB)
│
└── NestedFolders/├── Subfolder1/│ ├── file4.txt (4 KB)│ ├── file5.txt (5 KB)│ └── EmptySubfolder1/│├── Subfolder2/│ ├── file6.txt (6 KB)│ └── EmptySubfolder2/│└── Subfolder3/├── file7.txt (7 KB)└── EmptySubfolder3/
import os
import shutildef create_test_directory(root_path):# 创建根目录os.makedirs(root_path, exist_ok=True)# 创建空目录empty_folder_path = os.path.join(root_path, 'EmptyFolder')os.makedirs(empty_folder_path, exist_ok=True)# 创建包含小文件的目录small_files_path = os.path.join(root_path, 'SmallFiles')os.makedirs(small_files_path, exist_ok=True)for i in range(1, 4):file_path = os.path.join(small_files_path, f'file{i}.txt')with open(file_path, 'w') as file:file.write('x' * (i * 1024)) # 生成大小为 i KB 的文件# 创建包含大文件的目录large_files_path = os.path.join(root_path, 'LargeFiles')os.makedirs(large_files_path, exist_ok=True)for i in range(1, 4):file_path = os.path.join(large_files_path, f'big_file{i}.bin')with open(file_path, 'wb') as file:file.write(os.urandom(i * 10 * 1024 * 1024)) # 生成大小为 i * 10 MB 的二进制文件# 创建多层次嵌套目录nested_folders_path = os.path.join(root_path, 'NestedFolders')os.makedirs(nested_folders_path, exist_ok=True)for i in range(1, 4):subfolder_path = os.path.join(nested_folders_path, f'Subfolder{i}')os.makedirs(subfolder_path, exist_ok=True)file_path = os.path.join(subfolder_path, f'file{i + 3}.txt')with open(file_path, 'w') as file:file.write('x' * ((i + 3) * 1024))empty_subfolder_path = os.path.join(subfolder_path, f'EmptySubfolder{i}')os.makedirs(empty_subfolder_path, exist_ok=True)
在os.makedirs
函数中,exist_ok
参数用于指定是否在目录已经存在的情况下忽略错误。
- 如果
exist_ok
为True
,无论目标目录是否存在,os.makedirs
会执行,不会报错。 - 如果
exist_ok
为False
,并且目标目录已经存在,os.makedirs
会引发一个FileExistsError
异常。
exist_ok=True
允许函数在调用时多次执行,即使已经创建了目录结构,也不会引发错误。
Step2 遍历文件夹,计算文件夹大小
设计三个函数:
-
get_file_size(file_path)
函数:- 输入:文件路径
file_path
。 - 输出:返回该文件的大小(字节数),使用
os.path.getsize
函数获取。
- 输入:文件路径
-
format_size(size_bytes)
函数:- 输入:一个表示字节数的整数
size_bytes
。 - 输出:返回格式化后的字符串,该字符串包含适当的单位(B、KB、MB、GB)以及转换后的大小值。该函数通过迭代循环,将字节数转换为合适的单位。
- 输入:一个表示字节数的整数
-
get_directory_size(directory_path)
函数:- 输入:目录路径
directory_path
。 - 输出:返回该目录及其子目录中所有文件的总大小。
- 思路:
- 使用
os.walk
遍历目录,得到每个文件的路径。 - 对于每个文件,调用
get_file_size
函数获取其大小,并累计到总大小。 - 对于每个子目录,递归调用
get_directory_size
函数,将返回的子目录大小累加到总大小。 - 返回总大小。
- 使用
- 输入:目录路径
这样,通过这三个函数的协作,可以获取文件和目录的大小信息,并且通过 format_size
函数,可以将字节数格式化为易读的字符串。
import osdef get_file_size(file_path):"""计算文件大小(字节数)"""return os.path.getsize(file_path)def format_size(size_bytes):"""将字节数格式化为人类可读的字符串"""for unit in ['B', 'KB', 'MB', 'GB', 'TB']:if size_bytes < 1024.0:breaksize_bytes /= 1024.0return f"{size_bytes:.2f} {unit}"def get_directory_size(directory_path):"""递归计算目录大小,包括目录中所有文件和子目录的大小"""total_size = 0for dirpath, dirnames, filenames in os.walk(directory_path):# 计算文件大小for filename in filenames:file_path = os.path.join(dirpath, filename)total_size += get_file_size(file_path)# 计算子目录大小for dirname in dirnames:subdirectory_path = os.path.join(dirpath, dirname)total_size += get_directory_size(subdirectory_path)return total_size
上面返回的total_size是字节数。
另外说一下,函数中用到的 print(f"xxxx") 中的 f"xxxx" 是一个 f-string,是一种字符串格式化的方式,是在字符串前加上 f 或 F 前缀的字符串字面值。它允许在字符串中嵌入表达式,这些表达式会在运行时求值,并将结果插入到字符串中。可以使用大括号 {} 括起表达式,这些表达式将在运行时被替换为相应的值。例如:
name = "秦汉唐"
age = 25
print(f"姓名: {name} \t年龄 {age}")
f-string 中的 {name} 和 {age} 会分别被替换为变量 name 和 age 的值。
在测试的时候(testRun.py中):
import os
import shutil
from folder_size_calculator import get_directory_size, format_size, get_file_sizeif __name__=="__main__":# 测试函数create_test_directory('TestDirectory')# 测试directory_path = "TestDirectory" # 替换为你的目录路径total_size = get_directory_size(directory_path)formatted_size = format_size(total_size)print(f" '{directory_path}' 文件夹大小为: {formatted_size}")
执行testRun.py,结果类似:
>python testRun.py'TestDirectory' 文件夹大小为: 120.07 MB
Step3 优化
回顾上面的计算文件夹大小的程序,可能有些可以改进的方向
- 异常问题: 目前的代码缺少对一些异常情况的处理,例如无法访问的文件或目录。
- 性能问题: 对于非常大的目录结构,递归遍历可能会导致重复计算,可能影响计算文件大小效率。
- 符号链接问题: 目前的程序不处理符号链接,可能会导致计算错误或无限循环。
- 文件类型判断和过滤问题: 目前程序对文件和目录的处理方式一样,没有区分文件类型。
- 异常处理问题
因为是对文件进行处理,所以通过增加文件处理异常:
try:# 尝试获取文件大小或目录列表# ...
except (PermissionError, OSError) as e:print(f"Error accessing file or directory: {e}")
except FileNotFoundError as e:print(f"File not found: {e}")
except Exception as e:print(f"An unexpected error occurred: {e}")
对 get_file_size 函数进行异常处理
def get_file_size(file_path):"""计算文件大小(字节数)"""try:size_bytes = os.path.getsize(file_path)return size_bytesexcept (PermissionError, FileNotFoundError) as e:print(f"访问文件出错: {e}")return 0except Exception as e:print(f"出现异常: {e}")return 0
对 get_directory_size 函数进行异常处理
def get_directory_size(directory_path):"""递归计算目录大小,包括目录中所有文件和子目录的大小"""total_size = 0try:for dirpath, dirnames, filenames in os.walk(directory_path):# 计算文件大小for filename in filenames:file_path = os.path.join(dirpath, filename)total_size += os.path.getsize(file_path)# 计算子目录大小for dirname in dirnames:subdirectory_path = os.path.join(dirpath, dirname)total_size += get_directory_size(subdirectory_path)except (PermissionError, FileNotFoundError) as e:print(f"访问文件异常: {e}")return 0 # 或者抛出其他异常except Exception as e:print(f"出现异常: {e}")return 0return total_size
- 性能问题
我想利用数据库存储已经处理过的文件和文件夹。最简单的方式,数据库就用python自带的数据库,边做便设置数据库格式。
相关文章:

【笔记】计算文件夹的大小
目标:遍历文件夹,计算文件夹下包含文件和文件夹的大小。将这些结果存入python自带的数据库。 用大模型帮我设计并实现。 Step1 创建一个测试用的目录结构 创建目录结构如下所示: TestDirectory/ │ ├── EmptyFolder/ │ ├── SmallF…...

机器学习_常见算法比较模型效果(LR、KNN、SVM、NB、DT、RF、XGB、LGB、CAT)
文章目录 KNNSVM朴素贝叶斯决策树随机森林 KNN “近朱者赤,近墨者黑”可以说是 KNN 的工作原理。 整个计算过程分为三步: 计算待分类物体与其他物体之间的距离;统计距离最近的 K 个邻居;对于 K 个最近的邻居,它们属于…...

外包干了8个月,技术退步明显...
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

opencv#41 轮廓检测
轮廓概念介绍 通常我们使用二值化的图像进行轮廓检测,对轮廓以外到内进行数字命名,如下图,最外面的轮廓命名为0,向内部进行扩展,遇到黑色白色相交区域,就是一个新的轮廓,然后依次对轮廓进行编号…...

Websocket基本用法
1.Websocket介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 应用场景: 视频弹幕网页聊天体育实况更新股票基金…...

node.js与express.js创建项目以及连接数据库
搭建项目 一、技术准备 node版本:16.16.0 二、安装node成功后,安装express,命令如下: npm install -g express 或者: npm install --locationglobal express 再安装express的命令工具: npm install --location…...

【Tomcat与网络8】从源码看Tomcat的层次结构
在前面我们介绍了如何通过源码来启动Tomcat,本文我们就来看一下Tomcat是如何一步步启动的,以及在启动过程中,不同的组件是如何加载的。 一般,我们可以通过 Tomcat 的 /bin 目录下的脚本 startup.sh 来启动 Tomcat,如果…...

Java Agent Premain Agentmain
概念 premain是在jvm启动的时候类加载到虚拟机之前执行的 agentmain是可以在jvm启动后类已经加载到jvm中了,才去转换类。 这种方式会转换会有一些限制,比如不能增加或移除字段。 具体的做法,两者的实际做法是差不多的: premain 定义个静…...

Python实现设计模式-策略模式
策略模式是一种行为型设计模式,它定义了一系列算法或策略,并将它们封装成独立的类,使得它们可以相互替换,而不影响客户端的使用。 在策略模式中,算法或策略被封装在单独的策略类中,这些策略类实现了相同的…...

详解SpringCloud微服务技术栈:深入ElasticSearch(4)——ES集群
👨🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:深入ElasticSearch(3)——数据同步(酒店管理项目&a…...

AlmaLinux上安装Docker
AlmaLinux上安装Docker 文章目录 AlmaLinux上安装Docker一、前言二、具体步骤1、Docker 下载更新系统包索引:添加Docker仓库:安装Docker引擎: 2、Docker服务启动启动Docker服务:设置Docker开机自启: 3、Docker 安装验证…...

熟悉MATLAB 环境
一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能,熟悉Matlab 命令窗口及文件管理,Matlab 帮助系统。掌握命令行的输入及编辑,用户目录及搜索路径的配置。了解Matlab 数据的特点,熟悉Matlab 变量的命名规则&a…...

【数据库数据恢复】Oracle数据库ASM磁盘组数据恢复案例
oracle数据库故障&分析: oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。 oracle数据库数据恢复过程: 1、将oracle数据库所涉及磁盘以只读方式备份。后续的数据分析和数据恢复操作都…...

STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标
目录 1、准备材料 2、实验目标 3、模拟鼠标实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、设初始化调用流程 3.2.2、外设中…...

知道Wi-Fi名称和密码之后自动连接
这里写自定义目录标题 有Wi-Fi名称和密码自动连接Wi-Fi主Activity服务类 WIFIStateReceiver工具类 WIFIConnectionManager 有Wi-Fi名称和密码自动连接Wi-Fi 主Activity public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static…...

本地搭建Plex私人影音网站并结合内网穿透实现公网远程访问
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【算法】拦截导弹(线性DP)
题目 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由于该系…...

记 doris 加载压缩文件(lzo、snappy)pr
做了一个case,是doris支持加载lzo压缩文件。[improvement](load) Enable lzo & Remove dependency on Markus F.X.J. Oberhumers lzo library by HowardQin Pull Request #30573 apache/doris (github.com) 其实doris里已经支持了 lzo,这个case源…...

【Leetcode】2670. 找出不同元素数目差数组
文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums ,数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …...

༺༽༾ཊ—Unity之-01-工厂方法模式—ཏ༿༼༻
首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用工厂方法模式 创建 飞船模型, 首先资源商店下载飞船模型,…...

QT仪表盘小工具
头文件: /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE…...

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药
2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…...

计算机网络——网络层(3)
计算机网络——网络层(3) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)1 网络层——控制平面因特网中自治系统内部的路由选择总括考虑因素总结 ISP之间的路由选择:BGP考虑因素总结 SDN控制层面重要组件和功能总结 ICMP主要功能和特点…...

ROS2 学习笔记12:使用 colcon 构建软件包
ROS2 学习笔记12:使用 colcon 构建软件包 Background 背景Prerequisites 前提1 Install colcon2 Install ROS 2 Basics 基础1 Create a workspace2 Add some sources3 Source an underlay4 Build the workspace5 Run tests6 Source the environment7 Try a demo Cre…...

基于JAVA+SpringBoot+Vue的前后端分离的医院管理系统
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着计算机科学的迅猛…...

npm淘宝镜像过期解决办法
npm淘宝镜像过期解决办法 因为npm 官方镜像(registry.npmjs.org)在国内访问很慢,我们基本上都会选择切换到国内的一些 npm 镜像(淘宝镜像、腾讯云镜像等)。由于淘宝原来的镜像(registry.npm.taobao.org&am…...

Arduino 官网上下载和使用开发板
在 Arduino 官网上下载和使用开发板可以按照以下步骤进行: 打开浏览器,访问 Arduino 官网(https://www.arduino.cc/)。在官网首页,可以看到各种型号的 Arduino 开发板和相关产品。根据自己的需求选 择合适的开发板型号…...

k8s学习-DaemonSet和Job
1.1DaemonSet是什么 Deployment部署的副本Pod会分布在各个Node上,每个Node都可能运行好几个副本。DaemonSet的不同之处在于:每个Node上最多只能运行⼀个副本。DaemonSet的典型应用场景有: (1)在集群的每个节点上运⾏存…...

【开源】SpringBoot框架开发海南旅游景点推荐系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统ÿ…...

Windows10更新失败 错误 0x80070643、KB5034441的解决方法之二
Windows10更新失败 错误 0x80070643、KB5034441 在知乎Windows10更新失败 错误 0x80070643、KB5034441的原因分析和几个解决方法 - 知乎 参考文章进行操作,更详细信息自己看上面链接。 我电脑的硬盘是mbr格式,而且没有划分恢复分区。 Microsoft Windo…...