【Python】导入资源管理器的文件列表(计算文件和文件夹大小)
文章目錄
- 1.按照擴(kuò)展名進(jìn)行分類
- 2.導(dǎo)出文件的大小
- 3.計(jì)算文件夾大小
- 4.分類到字典
- 5.完整代碼及效果
1.按照擴(kuò)展名進(jìn)行分類
使用Python查詢一個(gè)路徑下的所有文件可以借助glob模塊以及os模塊。
在導(dǎo)入文件列表之前,我們需要指定我們的操作目錄,操作目錄一經(jīng)指定,在后續(xù)的函數(shù)中默認(rèn)查找路徑即為當(dāng)前設(shè)定的值。
注意:
- 區(qū)分文件(file)和文件夾(folder),二者沒(méi)有交集。
- 完整路徑名=路徑(path)+文件名(filename)
- 文件名=短文件名(shortname)+拓展名(extension)
以下簡(jiǎn)單介紹幾個(gè)函數(shù)的功能:
在本例中,我們需要加載的模塊就是兩個(gè):
2.導(dǎo)出文件的大小
os.stat(file).st_size可以導(dǎo)出file文件的大小(單位是B),其中file必須是文件名(短文件名+拓展名)組成的字符串,由于之前已經(jīng)制定了操作目錄,所以不需要列出完整路徑。但是僅能顯示B的大小是不易識(shí)別的,我們可以寫一個(gè)函數(shù)來(lái)將文件大小級(jí)別分為B,KB,MB,GB,TB幾個(gè)檔次,每一個(gè)級(jí)別的系數(shù)都小于1024。編寫函數(shù)如下:
def size_variable(file_size):# 將文件大小轉(zhuǎn)換為可視化數(shù)據(jù)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.計(jì)算文件夾大小
計(jì)算文件夾大小和計(jì)算文件大小有所區(qū)別,在這里我們可以給定一個(gè)函數(shù)計(jì)算文件夾目錄下的所有文件,再依次打開(kāi)每個(gè)文件夾,按照同樣的函數(shù)遞歸求和,最終得出文件夾所包含的文件總和。這么做固然可以,但缺點(diǎn)也很明顯——第一,作為遞歸算法,當(dāng)文件夾層數(shù)較多但是文件數(shù)目不大時(shí),該代碼運(yùn)行效率低;第二,該代碼需要在函數(shù)內(nèi)部加入遞歸環(huán)節(jié),書寫復(fù)雜。
因此,在此提供一種簡(jiǎn)單的方法計(jì)算文件夾的大小,即調(diào)用第一部分的函數(shù)7——glob("**",recursive=True)導(dǎo)出所有的路徑。這是一個(gè)很方便的做法,我們可以將路徑更新至我們需要計(jì)算的文件夾下,再調(diào)用此方法。同時(shí)利用列表解析,篩選出有拓展名的路徑(即真正是文件的路徑path,因?yàn)橹挥形募哂写笮?#xff09;,最后把他們的大小加起來(lái),即得到我們需要的文件夾大小,書寫函數(shù)如下:
4.分類到字典
如果說(shuō)要顯示一個(gè)文件列表的話,按照擴(kuò)展名分類到字典是最不錯(cuò)的選擇,將文件拓展名保存至一個(gè)集合(或列表),將文件名保存到一個(gè)列表,再將文件夾保存到一個(gè)列表,最后運(yùn)用字典解析構(gòu)造字典(每一個(gè)鍵對(duì)應(yīng)的值都是一個(gè)列表,對(duì)于每一個(gè)文件,以該文件的拓展名為鍵,將其短文件名添加到該鍵對(duì)應(yīng)的值(一個(gè)列表)中)。
在這個(gè)示例中需要同時(shí)導(dǎo)出文件和文件夾,那么os.listdir()即是最好的選擇。然而情況并沒(méi)有這么簡(jiǎn)單——文件夾和文件是需要作區(qū)分的,這個(gè)區(qū)分在于文件夾沒(méi)有extension(文件拓展名)屬性,利用此方法將文件夾單獨(dú)分離出來(lái),單獨(dú)構(gòu)成一鍵添加到字典。
5.完整代碼及效果
當(dāng)前目錄為:
輸出效果如下:
我們隨便打開(kāi)幾個(gè)文件夾查看一下大小:
我們標(biāo)定的是2.15MB
我們標(biāo)定的是1.57MB
我們標(biāo)定的是486B
可以看出,文件夾的大小和資源管理器標(biāo)出的略有差異,但是差異較小,另外需注意這個(gè)文件大小和實(shí)際占用大小的區(qū)別,一般情況下由于存儲(chǔ)空間不能100%利用,實(shí)際占用大小都會(huì)略大于文件大小。
通過(guò)修改Current_dir可以得到不同目錄下的文件列表。可以看出文本文檔中的文件目錄和資源管理器中的一致。
最后值得一提的是本代碼的幫助文檔,按照此格式書寫的幫助(放在所有代碼開(kāi)頭):
假若在調(diào)試器中(Python Console或者Shell IDLE)調(diào)用help函數(shù),也可以很方便地得到該模塊信息,以下為在Shell中的場(chǎng)景:
>>> import File_Directory 當(dāng)前操作目錄為:C:\Users\ouni\AppData\Local\Programs\Python\Python36 >>> print(File_Directory.__doc__) 文件系統(tǒng)查看器 查看該系統(tǒng)目錄下的文件并分類顯示 該文件查看器具有顯示文件大小及其文件夾大小的功能 >>> help(File_Directory) Help on module File_Directory:NAMEFile_DirectoryDESCRIPTION文件系統(tǒng)查看器查看該系統(tǒng)目錄下的文件并分類顯示該文件查看器具有顯示文件大小及其文件夾大小的功能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入門教程\文件系統(tǒng)'__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入門教程\文件系統(tǒng)\file_directory.py 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【Python】导入资源管理器的文件列表(计算文件和文件夹大小)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Visual Studio 2012资源
- 下一篇: 【Python】mmSegmentati