【Python】导入资源管理器的文件列表(计算文件和文件夹大小)

文章目录

  • 1.按照扩展名进行分类
  • 2.导出文件的大小
  • 3.计算文件夹大小
  • 4.分类到字典
  • 5.完整代码及效果

1.按照扩展名进行分类

使用Python查询一个路径下的所有文件可以借助glob模块以及os模块。
在导入文件列表之前,我们需要指定我们的操作目录,操作目录一经指定,在后续的函数中默认查找路径即为当前设定的值。
注意:

  • 区分文件(file)和文件夹(folder),二者没有交集。
  • 完整路径名=路径(path)+文件名(filename)
  • 文件名=短文件名(shortname)+拓展名(extension)

以下简单介绍几个函数的功能:

  1. os.getcwd()——返回操作目录
  2. os.chdir(Current_dir)——将Current_dir设置为当前操作路径
  3. glob.glob("*.*")——返回操作目录下的所有文件
  4. glob.glob("*.pdf")——返回操作目录下所有PDF类型的文件
  5. glob.glob("*test*.*")——返回含有test的任意文件
  6. glob.glob("*test*.pdf)——返回操作目录下含“test”的pdf文件
  7. glob.glob("**",recursive=True)——返回该目录下所有文件夹和文件路径
  8. os.listdir()——列出该操作目录下的所有文件及其文件夹
  9. (dirname,filename)=os.path.split(pathname)——将完整路径名的路径和文件名分离
  10. (shortname,extension)=os.path.splitext(filename)——将短文件名和拓展名分离
    在本例中,我们需要加载的模块就是两个:
import os, glob

2.导出文件的大小

os.stat(file).st_size可以导出file文件的大小(单位是B),其中file必须是文件名(短文件名+拓展名)组成的字符串,由于之前已经制定了操作目录,所以不需要列出完整路径。但是仅能显示B的大小是不易识别的,我们可以写一个函数来将文件大小级别分为B,KB,MB,GB,TB几个档次,每一个级别的系数都小于1024。编写函数如下:

def size_variable(file_size):# 将文件大小转换为可视化数据if file_size<2**10:return str(file_size)+"B"   # <1KB用单位B表示elif file_size<2**20:return format(file_size/(2**10),".2f")+"KB" # >1KB且<1MB用单位KB表示elif file_size<2**30:return format(file_size/(2**20),".2f")+"MB" # >1MB且<1GB用单位MB表示elif file_size<2**40:return format(file_size/(2**30),".2f")+"GB" # >1GB且<1TB用单位GB表示else:return format(file_size/(2**40),".2f")+"TB" # >1TB直接用TB表示

3.计算文件夹大小

计算文件夹大小和计算文件大小有所区别,在这里我们可以给定一个函数计算文件夹目录下的所有文件,再依次打开每个文件夹,按照同样的函数递归求和,最终得出文件夹所包含的文件总和。这么做固然可以,但缺点也很明显——第一,作为递归算法,当文件夹层数较多但是文件数目不大时,该代码运行效率低;第二,该代码需要在函数内部加入递归环节,书写复杂。
因此,在此提供一种简单的方法计算文件夹的大小,即调用第一部分的函数7——glob("**",recursive=True)导出所有的路径。这是一个很方便的做法,我们可以将路径更新至我们需要计算的文件夹下,再调用此方法。同时利用列表解析,筛选出有拓展名的路径(即真正是文件的路径path,因为只有文件具有大小),最后把他们的大小加起来,即得到我们需要的文件夹大小,书写函数如下:

def folder_size(folder):os.chdir(os.path.join(Current_dir,folder))  # 更新当前的操作目录为文件夹下目录all_files = glob.glob('**', recursive=True)  # 导入所有文件路径all_files = [file for file in all_files if os.path.splitext(file)[1]]   # 筛选出该文件夹下所有文件(包含子目录文件)all_files_size = [os.stat(file).st_size for file in all_files]  # 将所有文件大小统计至列表os.chdir(Current_dir)   # 还原原操作目录return sum(all_files_size)  # 返回所有文件的大小(单位B)

4.分类到字典

如果说要显示一个文件列表的话,按照扩展名分类到字典是最不错的选择,将文件拓展名保存至一个集合(或列表),将文件名保存到一个列表,再将文件夹保存到一个列表,最后运用字典解析构造字典(每一个键对应的值都是一个列表,对于每一个文件,以该文件的拓展名为键,将其短文件名添加到该键对应的值(一个列表)中)。
在这个示例中需要同时导出文件和文件夹,那么os.listdir()即是最好的选择。然而情况并没有这么简单——文件夹和文件是需要作区分的,这个区分在于文件夹没有extension(文件拓展名)属性,利用此方法将文件夹单独分离出来,单独构成一键添加到字典。

5.完整代码及效果

当前目录为:
文件目录

"""文件系统查看器
查看该系统目录下的文件并分类显示
该文件查看器具有显示文件大小及其文件夹大小的功能"""
__author__ = "ouni"
__version__ = "V1.1"
__date__ = "$Date:2019/2/25"
__copyright__ = "Copyright (c) 2019 欧倪"
__license__ = "Python3.6.5"
import os, glob  # 载入文件系统Python模块
Current_dir = r'C:\Users\ouni\AppData\Local\Programs\Python\Python36'
Initial_dir = os.getcwd()def size_variable(file_size):# 将文件大小转换为可视化数据if file_size<2**10:return str(file_size)+"B"   # <1KB用单位B表示elif file_size<2**20:return format(file_size/(2**10),".2f")+"KB" # >1KB且<1MB用单位KB表示elif file_size<2**30:return format(file_size/(2**20),".2f")+"MB" # >1MB且<1GB用单位MB表示elif file_size<2**40:return format(file_size/(2**30),".2f")+"GB" # >1GB且<1TB用单位GB表示else:return format(file_size/(2**40),".2f")+"TB" # >1TB直接用TB表示def print_dict(dict1):# 打印字典for key in dict1.keys():print(str(key)+':')for filename in dict1[key]:print(' '*len(key)+'|'+str(filename))def write_dict(dict1,file1):# 保存字典for key in dict1.keys():file1.writelines(str(key)+':\n')for filename in dict1[key]:file1.writelines(' '*3+'|'+str(filename)+'\n')def folder_size(folder):os.chdir(os.path.join(Current_dir,folder))  # 更新当前的操作目录为文件夹下目录all_files = glob.glob('**', recursive=True)  # 导入所有文件路径all_files = [file for file in all_files if os.path.splitext(file)[1]]   # 筛选出该文件夹下所有文件(包含子目录文件)all_files_size = [os.stat(file).st_size for file in all_files]  # 将所有文件大小统计至列表os.chdir(Current_dir)   # 还原原操作目录return sum(all_files_size)  # 返回所有文件的大小(单位B)print("当前操作目录为:%s" % Current_dir)
os.chdir(Current_dir)    # 更新默认奥做系统为当前目录
Files = glob.glob('*.*')  # 所有文件的目录,导入之后为list格式
Folders_and_Files = os.listdir(Current_dir)  # 导入所有路径
Folders = [folder+"("+size_variable(folder_size(folder))+")" for folder in Folders_and_Files if not os.path.splitext(folder)[1]]  # 没有文件后缀名的是文件夹
File_Ext = [os.path.splitext(file)[1] for file in Files]  # 文件的扩展名列表
File_Ext = list(set(File_Ext))  # 先转换为集合再转换为列表,去除所有重复元素
File_Ext.append("Folders")  # 人为添加文件夹类型的扩展名,以供字典解析
File_Dict = {Ext: [] for Ext in File_Ext}  # 以文件扩展名为关键字构成的字典
for file in Files:  # 将文件扩展名添加至字典Ext = os.path.splitext(file)[1]  # 获得拓展名File_Dict[Ext].append(os.path.splitext(file)[0]+'('+size_variable(os.stat(file).st_size)+')')   # 加入字典文件名信息及其大小
File_Dict["Folders"].extend(Folders)  # 将文件夹全部录入字典
print_dict(File_Dict)
os.chdir(r"C:\Users\ouni\桌面")
with open('%s_File_Dir.txt' % os.path.split(Current_dir)[1], mode='w', encoding='utf-8') as a_file:a_file.write("文件系统目录为%s\n" % Current_dir)write_dict(File_Dict, a_file)os.chdir(Initial_dir)   # 恢复原始路径,供Python Console或者Python Shell调试

输出效果如下:
在这里插入图片描述
我们随便打开几个文件夹查看一下大小:
在这里插入图片描述
我们标定的是2.15MB
在这里插入图片描述
我们标定的是1.57MB
在这里插入图片描述
我们标定的是486B
可以看出,文件夹的大小和资源管理器标出的略有差异,但是差异较小,另外需注意这个文件大小和实际占用大小的区别,一般情况下由于存储空间不能100%利用,实际占用大小都会略大于文件大小。
通过修改Current_dir可以得到不同目录下的文件列表。可以看出文本文档中的文件目录和资源管理器中的一致。
最后值得一提的是本代码的帮助文档,按照此格式书写的帮助(放在所有代码开头):

"""文件系统查看器
查看该系统目录下的文件并分类显示
该文件查看器具有显示文件大小及其文件夹大小的功能"""
__author__ = "ouni"
__version__ = "V1.1"
__date__ = "$Date:2019/2/25"
__copyright__ = "Copyright (c) 2019 欧倪"
__license__ = "Python3.6.5"

假若在调试器中(Python Console或者Shell IDLE)调用help函数,也可以很方便地得到该模块信息,以下为在Shell中的场景:

>>> import File_Directory
当前操作目录为:C:\Users\ouni\AppData\Local\Programs\Python\Python36
>>> print(File_Directory.__doc__)
文件系统查看器
查看该系统目录下的文件并分类显示
该文件查看器具有显示文件大小及其文件夹大小的功能
>>> help(File_Directory)
Help on module File_Directory:NAMEFile_DirectoryDESCRIPTION文件系统查看器查看该系统目录下的文件并分类显示该文件查看器具有显示文件大小及其文件夹大小的功能FUNCTIONSfolder_size(folder)print_dict(dict1)size_variable(file_size)write_dict(dict1, file1)DATACurrent_dir = r'C:\Users\ouni\AppData\Local\Programs\Python\Python36'Ext = '.dll'File_Dict = {'.dll': ['python3(57.15KB)', 'python36(3.44MB)', 'vcrunti...File_Ext = ['.dll', '.exe', '.txt', '.pth', '.py', 'Folders']Files = ['LICENSE.txt', 'NEWS.txt', 'PIL.pth', 'python.exe', 'python3....Folders = ['DLLs(11.10MB)', 'Doc(7.65MB)', 'exercises(644B)', 'include...Folders_and_Files = ['DLLs', 'Doc', 'exercises', 'include', 'Lib', 'li...Initial_dir = r'C:\Users\ouni\桌面\办公\编程\Python 3.6\Python3入门教程\文件系统'__copyright__ = 'Copyright (c) 2019 ouni'__license__ = 'Python3.6.5'a_file = <_io.TextIOWrapper name='Python36_File_Dir.txt' mode='w' enco...file = 'vcruntime140.dll'VERSIONV1.1DATE$Date:2019/2/25AUTHORouniFILEc:\users\ouni\桌面\办公\编程\python 3.6\python3入门教程\文件系统\file_directory.py

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

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

相关文章

HashMap 中的一个“坑”!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;最近公司新来了一个小伙伴&#xff0c;问了磊哥一个比较“奇怪”的问题&#xff0c;这个问题本身的难度并不大&#xff0c;但…

【Python】交互式界面创建函数

文章目录简介规则思路示例代码与运行效果简介 运行Python时&#xff0c;在程序运行过程中手动输入一个函数表达式&#xff0c;并将其作为一个函数进行后续的调用工作&#xff0c;类似于Matlab里面的匿名函数。这个功能使用传统语言会相当麻烦&#xff0c;当然&#xff0c;我也…

原生 js前端路由系统实现3之代码 构建工具 和 querystring功能

为什么80%的码农都做不了架构师&#xff1f;>>> 构建 目前前端构建工具流行的是 grunk.js 功能是大而全&#xff0c;但往往大而全的东西为了多样性 需要做额外的配置 我还是想要有一个专门为自己特性项目而生构建工具 我不想加载第三方的node模块&#xff0c;也不…

单例模式,真不简单

前言单例模式无论在我们面试&#xff0c;还是日常工作中&#xff0c;都会面对的问题。但很多单例模式的细节&#xff0c;值得我们深入探索一下。这篇文章透过单例模式&#xff0c;串联了多方面基础知识&#xff0c;非常值得一读。1 什么是单例模式&#xff1f;单例模式是一种非…

【python】最优化方法之一维搜索(黄金分割法+斐波那契法)

文章目录1.概念2.遍历搜索3.优化算法3.1.一维搜索原则3.2.黄金分割法Code Block3.3.斐波拉契法Code Block1.概念 \qquad一维搜索是最优化方法最简单的一种&#xff0c;即求一个在(a,b)内&#xff0c;连续下单峰函数f(x)f(x)f(x)的极小值。所谓下单峰函数就是只有一个极小值的函…

MySQL系列之E-1------MySQL主从复制原理

主从复制是异步复制,可以通过google的一个插件实现半同步E.1 主从复制原理1、建立主从复制的用户名和密码2、将master上主库需要进行复制的库“锁库”3、通过mysqldump备份master上主库&#xff0c;“解锁“&#xff0c;在slave端进行恢复4、更改配置文件5、在丛库上执行change…

工作中常用的 6 种设计模式!

前言 哈喽&#xff0c;大家好。平时我们写代码呢&#xff0c;多数情况都是流水线式写代码&#xff0c;基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢&#xff0c;我觉得&#xff0c;最好的方式就是&#xff1a;使用设计模式优化自己的业务代码。今天跟大家聊聊日常工作中…

【Matlab/C/Python/VB/...】代码复制到word时如何变成彩色的

文章目录下载Notepad复制代码在Notepad粘贴在word中粘贴下载Notepad Notepad是一款免费的Windows软件&#xff0c;一般Windows10和Windows7系统都已经自带&#xff0c;也可以在应用商店直接搜索下载 「win10系统兼容的是7.8版本」 复制代码 在语言编辑乱码复制代码&#xff…

hadoop 2.5.0安装和配置

安装hadoop要先做以下准备&#xff1a; 1.jdk&#xff0c;安装教程在 http://www.cnblogs.com/stardjyeah/p/4640917.html 2.ssh无密码验证&#xff0c;配置教程在 http://www.cnblogs.com/stardjyeah/p/4641524.html 3.linux静态ip配置&#xff0c;教程在 http://www.cnblo…

基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

目录1.图像旋转的原理1.1.旋转矩阵1.2.双线性插值1.3.像素点匹配2.实现效果与说明1.图像旋转的原理 1.1.旋转矩阵 旋转一幅图像&#xff08;假设这幅图像大小是矩形的&#xff09;&#xff0c;当然应该从像素点&#xff08;pixels&#xff09;开始&#xff0c;在直角坐标系中…

漫画:给女朋友介绍什么是 “元宇宙” ?

什么是更高的自由度呢&#xff1f;或许有人觉得&#xff0c;我们在网络游戏当中&#xff0c;不是也很自由吗&#xff1f;想怎么玩就怎么玩。但是&#xff0c;无论一款网络游戏的元素有多么丰富&#xff0c;游戏当中的角色、任务、职业、道具、场景&#xff0c;都是游戏设计师预…

MyBatis 中为什么不建议使用 where 1=1?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;最近接手了一个老项目&#xff0c;“愉悦的心情”自然无以言表&#xff0c;做开发的朋友都懂&#xff0c;这里就不多说了&am…

【openMV与机器视觉】四旋翼飞行控制背景下的PID控制与摄像头算法简介

文章目录声明1.四旋翼飞行控制简介2.飞行控制算法2.1.接收机PWM生成2.2.PID算法位置PID速度PID3.摄像头算法3.1.图像处理3.2.霍夫曼变换3.3.巡线算法3.3.寻找目标点降落算法声明 \qquad本文的算法在openMV IDE例程的基础上进行原创&#xff0c;在比赛结束后予以发表&#xff1b…

聊聊sql优化的15个小技巧

前言sql优化是一个大家都比较关注的热门话题&#xff0c;无论你在面试&#xff0c;还是工作中&#xff0c;都很有可能会遇到。如果某天你负责的某个线上接口&#xff0c;出现了性能问题&#xff0c;需要做优化。那么你首先想到的很有可能是优化sql语句&#xff0c;因为它的改造…

【MATLAB】Parzen窗与K近邻算法原理与代码详解

文章目录1.非参数估计原理2.Parzen窗2.1.算法原理2.2.Matlab实现与参数探究3.K近邻3.1.算法原理3.2.Matlab实现与参数探究1.非参数估计原理 \qquad已知一个样本的概率分布时&#xff0c;我们只需要对概率分布中的参数进行估计即可得到该样本的概率密度函数。例如已知样本X服从正…

使用 Lambda 表达式实现超强的排序功能

我们在系统开发过程中&#xff0c;对数据排序是很常见的场景。一般来说&#xff0c;我们可以采用两种方式&#xff1a;借助存储系统&#xff08;SQL、NoSQL、NewSQL 都支持&#xff09;的排序功能&#xff0c;查询的结果即是排好序的结果查询结果为无序数据&#xff0c;在内存中…

【mongodb系统学习之四】查看mongodb进程

四、查看mongodb进程&#xff08;可以配合启动和关闭使用&#xff09;&#xff1a; 1&#xff09;、方法一&#xff1a;直接查看mongodb进程是否已经存在&#xff08;用上面的方式启动后&#xff0c;需要另开一个窗口操作&#xff09;&#xff1a;ps –ef|grep mongodb, 如图&a…

【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)

目录0.背景1.粒子群算法1.1.算法简介1.2.算法步骤1.3.算法举例2.PID自整定2.1.基于M文件编写的PID参数自整定*2.2.复杂系统的PID自整定&#xff08;基于simulink仿真&#xff09;2.2.1.PSO优化PID的过程详解2.2.2.在PSO优化过程中修改参数价值权重阅读前必看&#xff1a;本代码…

SpringBoot 使用注解实现消息广播功能

背景在开发工作中&#xff0c;会遇到一种场景&#xff0c;做完某一件事情以后&#xff0c;需要广播一些消息或者通知&#xff0c;告诉其他的模块进行一些事件处理&#xff0c;一般来说&#xff0c;可以一个一个发送请求去通知&#xff0c;但是有一种更好的方式&#xff0c;那就…

【Matlab】模式识别——聚类算法集锦

文章目录0.聚类分析简介0.1.简单的聚类样本生成器1.静态聚类算法1.1.最近邻聚类算法1.1.1.算法原理1.1.2.参考代码1.1.3.参数选择及运行结果1.2.最大最小距离法1.2.1.算法原理1.2.2.参考代码1.2.3.参数选择及运行结果2.动态聚类算法2.1.C均值聚类算法2.1.1.算法原理2.1.2.参考代…