日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2025/3/11 python 91 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】导入资源管理器的文件列表(计算文件和文件夹大小) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 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ù)的功能:

  • os.getcwd()——返回操作目錄
  • os.chdir(Current_dir)——將Current_dir設(shè)置為當(dāng)前操作路徑
  • glob.glob("*.*")——返回操作目錄下的所有文件
  • glob.glob("*.pdf")——返回操作目錄下所有PDF類型的文件
  • glob.glob("*test*.*")——返回含有test的任意文件
  • glob.glob("*test*.pdf)——返回操作目錄下含“test”的pdf文件
  • glob.glob("**",recursive=True)——返回該目錄下所有文件夾和文件路徑
  • os.listdir()——列出該操作目錄下的所有文件及其文件夾
  • (dirname,filename)=os.path.split(pathname)——將完整路徑名的路徑和文件名分離
  • (shortname,extension)=os.path.splitext(filename)——將短文件名和拓展名分離
    在本例中,我們需要加載的模塊就是兩個(gè):
  • import os, glob

    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ù)如下:

    def folder_size(folder):os.chdir(os.path.join(Current_dir,folder)) # 更新當(dāng)前的操作目錄為文件夾下目錄all_files = glob.glob('**', recursive=True) # 導(dǎo)入所有文件路徑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] # 將所有文件大小統(tǒng)計(jì)至列表os.chdir(Current_dir) # 還原原操作目錄return sum(all_files_size) # 返回所有文件的大小(單位B)

    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)前目錄為:

    """文件系統(tǒng)查看器 查看該系統(tǒng)目錄下的文件并分類顯示 該文件查看器具有顯示文件大小及其文件夾大小的功能""" __author__ = "ouni" __version__ = "V1.1" __date__ = "$Date:2019/2/25" __copyright__ = "Copyright (c) 2019 歐倪" __license__ = "Python3.6.5" import os, glob # 載入文件系統(tǒng)Python模塊 Current_dir = r'C:\Users\ouni\AppData\Local\Programs\Python\Python36' Initial_dir = os.getcwd()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表示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)) # 更新當(dāng)前的操作目錄為文件夾下目錄all_files = glob.glob('**', recursive=True) # 導(dǎo)入所有文件路徑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] # 將所有文件大小統(tǒng)計(jì)至列表os.chdir(Current_dir) # 還原原操作目錄return sum(all_files_size) # 返回所有文件的大小(單位B)print("當(dāng)前操作目錄為:%s" % Current_dir) os.chdir(Current_dir) # 更新默認(rèn)奧做系統(tǒng)為當(dāng)前目錄 Files = glob.glob('*.*') # 所有文件的目錄,導(dǎo)入之后為list格式 Folders_and_Files = os.listdir(Current_dir) # 導(dǎo)入所有路徑 Folders = [folder+"("+size_variable(folder_size(folder))+")" for folder in Folders_and_Files if not os.path.splitext(folder)[1]] # 沒(méi)有文件后綴名的是文件夾 File_Ext = [os.path.splitext(file)[1] for file in Files] # 文件的擴(kuò)展名列表 File_Ext = list(set(File_Ext)) # 先轉(zhuǎn)換為集合再轉(zhuǎn)換為列表,去除所有重復(fù)元素 File_Ext.append("Folders") # 人為添加文件夾類型的擴(kuò)展名,以供字典解析 File_Dict = {Ext: [] for Ext in File_Ext} # 以文件擴(kuò)展名為關(guān)鍵字構(gòu)成的字典 for file in Files: # 將文件擴(kuò)展名添加至字典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("文件系統(tǒng)目錄為%s\n" % Current_dir)write_dict(File_Dict, a_file)os.chdir(Initial_dir) # 恢復(fù)原始路徑,供Python Console或者Python Shell調(diào)試

    輸出效果如下:

    我們隨便打開(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)頭):

    """文件系統(tǒng)查看器 查看該系統(tǒng)目錄下的文件并分類顯示 該文件查看器具有顯示文件大小及其文件夾大小的功能""" __author__ = "ouni" __version__ = "V1.1" __date__ = "$Date:2019/2/25" __copyright__ = "Copyright (c) 2019 歐倪" __license__ = "Python3.6.5"

    假若在調(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。