我的github地址。
代碼:
1 # -*- coding: utf-8 -*- 2 __author__ = "YuDian" 3 ''' 4 v1.0: 2018/3/19 21:39 5 完成對指定的文件夾(TopDir)內部的文件和目錄進行排序。文件和目錄混合排序。可選擇從小到大或者是從大到小。 6 ''' 7 import os 8 9 class dirc(object): # dirc類用來表示文件的大小和類型(kb,mb,gb) 10 def __init__(self,name,size,sizetype,ctype=0): 11 self.name=name # name存放名字 12 self.size=size # size存放更換過的大小 13 self.sizetype=sizetype # sizetype存放類型 14 self.ctype=ctype # file or dir 15 self.realtype=self.int2str(self.sizetype) # 類型的真實意義 b,kb,mb,gb 16 self.realctype=self.ctype2real(self.ctype) 17 18 def int2str(self,sizetype): 19 if self.sizetype==1: 20 return 'Byte' 21 elif self.sizetype==2: 22 return 'KB' 23 elif self.sizetype==3: 24 return 'MB' 25 elif self.sizetype == 4: 26 return 'GB' 27 28 def ctype2real(self,ctype): 29 if ctype==1: 30 return 'Dir' 31 elif ctype==0: 32 return 'File' 33 34 def printlog(self): 35 print(self.realctype,':',self.name,'__',self.size,self.realtype) 36 37 AllSize=[] # AllSize用來存放所有的dirc類 38 39 def single_dir_size(dirname): #程序的功能是對傳入的文件夾計算大小的單位 40 size=GetDirSize(dirname) # 調用GetDirSize函數,得到原始大小 41 BeautifulSize,sizetype=beautiful_size(size) # 調用beautiful_size函數,得到變換后的大小和單位 42 return BeautifulSize,sizetype 43 44 def GetDirSize(dirname): # 得到dirfile的大小。dirname是文件夾名 45 TotalSize=0 46 for (DownRoot,DownDirs,DownFiles) in os.walk(dirname): 47 for file in DownFiles: 48 TotalSize=TotalSize+os.path.getsize(os.path.join(DownRoot,file)) 49 return TotalSize 50 51 52 def beautiful_size(size): # 對size進行單位轉換 53 sizeflag=1 54 while size>1024: 55 size=size/1024 56 sizeflag=sizeflag+1 # sizeflag:1 byte 2: kb 3:mb 4:gb 57 return size,sizeflag 58 59 def all_sort(list,SortType=1): # SortType:1 AllSize[0]:min SortType:0 AllSize[0]:max 60 61 # 不能用可變參量*name傳入list。不然在函數內會變成tuple 62 63 #用冒泡排序法對List進行排序 64 for n in range(0,len(AllSize)-1): 65 for i in range(0,len(AllSize)-1-n): 66 RivalLow=AllSize[i] 67 RivalHigh=AllSize[i+1] 68 c=RivalLow.size * 1024 ** (RivalLow.sizetype - 1) 69 d=RivalHigh.size * 1024 ** (RivalHigh.sizetype - 1) 70 if RivalLow.size*1024**(RivalLow.sizetype-1)>RivalHigh.size*1024**(RivalHigh.sizetype-1): 71 AllSize[i],AllSize[i+1]=RivalHigh,RivalLow 72 if SortType==1: # 選擇排序方法:默認從小到大 73 return AllSize # 1 從小到大 74 elif SortType==0: 75 return AllSize[::-1] # 0 從大到小 76 77 78 79 n=1 # 得到TopDor下一層的文件夾名 80 TopDir=r'F:\for_python' # TopDir 指向最高層的文件夾 81 for(root,dirs,files) in os.walk(TopDir): 82 if n==1: 83 FirstName=dirs # FirstName下存放的是TopDir下第一層的文件夾名(只有名字,不是全路徑) 84 FirstFiles=files 85 n = n + 1 86 for FileName in FirstFiles: 87 FileFullName=os.path.join(root,FileName) 88 FileSize=os.path.getsize(FileFullName) 89 FileSize,FileSizeType=beautiful_size(FileSize) 90 AllSize.append(dirc(name=FileFullName,size=round(FileSize,3),sizetype=FileSizeType,ctype=0)) 91 92 for name in FirstName: 93 DirAllName=os.path.join(root,name) # 得到文件夾的完整路徑 94 DirSize,DirSizeType=single_dir_size(DirAllName) # 得到文件大小和單位 95 AllSize.append(dirc(name=DirAllName,size=round(DirSize,3),sizetype=DirSizeType,ctype=1)) # 將信息組成class放到List中。 96 # round(size,n) 將傳入的數據size保留n位小數。 97 # for i in AllSize: 98 # print(i.name,'__',i.size,'__',i.realtype) 99 # print(type(AllSize)) 100 SortedAllSize=all_sort(AllSize) 101 for i in SortedAllSize: 102 i.printlog()
