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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

文章目錄

  • 1.按照擴展名進行分類
  • 2.導出文件的大小
  • 3.計算文件夾大小
  • 4.分類到字典
  • 5.完整代碼及效果

1.按照擴展名進行分類

使用Python查詢一個路徑下的所有文件可以借助glob模塊以及os模塊。
在導入文件列表之前,我們需要指定我們的操作目錄,操作目錄一經指定,在后續的函數中默認查找路徑即為當前設定的值。
注意:

  • 區分文件(file)和文件夾(folder),二者沒有交集。
  • 完整路徑名=路徑(path)+文件名(filename)
  • 文件名=短文件名(shortname)+拓展名(extension)

以下簡單介紹幾個函數的功能:

  • os.getcwd()——返回操作目錄
  • os.chdir(Current_dir)——將Current_dir設置為當前操作路徑
  • 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)——將短文件名和拓展名分離
    在本例中,我們需要加載的模塊就是兩個:
  • 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可以得到不同目錄下的文件列表??梢钥闯鑫谋疚臋n中的文件目錄和資源管理器中的一致。
    最后值得一提的是本代碼的幫助文檔,按照此格式書寫的幫助(放在所有代碼開頭):

    """文件系統查看器 查看該系統目錄下的文件并分類顯示 該文件查看器具有顯示文件大小及其文件夾大小的功能""" __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 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的【Python】导入资源管理器的文件列表(计算文件和文件夹大小)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。