我的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()
