【Python】CDay-1 优化!对自个的反省

编程实现以下功能并进行最大化的优化:遍历指定目录下的所有文件,找出其中占用空间最大的前3个文件。

#!/usr/bin/env python
#-*- coding: utf-8 -*-
'''selectbiggestfile.py
    @note: 使用os.stat获取相关信息,os.walk遍历,
    @see: help(os)
    @authoer: U{119<mailto:[email protected]>}
    @version: $id$
'''
import sys
import os
def get_top_three(path):
    '''获取给定路径中文件大小最大的三个
    @param path: 指定路径
    @return 返回一个list,每项为(size, filename)
    '''
    all_file = {}
    for root, dirs, files in os.walk(path): #遍历path
        for onefile in files:
            fname = os.path.join(root, onefile) #获得当前处理文件的完整名字
            #print 'fname is %s' %fname
            fsize = os.stat(fname).st_size #获得当前处理文件大小
            #print 'all_file is %s' %all_file
            if all_file.has_key(fsize): #按照文件大小存储
                all_file[fsize].append(fname) 
            else:
                all_file[fsize] = [fname]
    fsize_key = all_file.keys() #得到所有的文件大小
    print 'fsize_key is %s\n' %fsize_key
    fsize_key.sort() #排序,从小到大
    print 'fsize_key is %s\n' %fsize_key
    result = []
    for i in [-1, -2, -3]: #依次取最大的三个
        print 'all_file[fsize_key[i]] is %s\n' %all_file[fsize_key[i]]
        print 'fsize_key[i] is %s\n' %fsize_key[i]
        for j in all_file[fsize_key[i]]: #保存
            result.append((fsize_key[i], j))
    print 'result is %s\n' %result
    return result[:3] #返回前三个
if __name__ == "__main__":
    if len(sys.argv) == 1:
        print 'usage:\n\tpython selectbiggestfile.py path'
    else:
        print 'sys.argv is %s\n' %sys.argv
        abs_path = os.path.abspath(sys.argv[1]) #得到绝对路径
        print 'abs_path is %s\n' %abs_path
        if not os.path.isdir(abs_path): #判断所给的路径是否存在
            print '%s is not exist' %abs_path
        else:
            top = get_top_three(abs_path)
            print 'top is %s\n' %top
            for (s, f) in top:
                print '%s\t -> \t%s' %(f,s)

 

运行截屏:

【Python】CDay-1 优化!对自个的反省

 利用ConfigParser,将上述题目中产生的结果按照cdays+1-my.ini格式存储到文件cdays+1-result.txt中。

  • cdays+1-my.ini内容为:

                        

[Number]
filesize = somefilesize
filename = somefilename

 

源代码
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os
import sys
from ConfigParser import RawConfigParser
from selectbiggestfile import get_top_three

'''parseresult.py
   @note: 利用ConfigParser解析ini格式
   @see: 文档参见http://pydoc.org/2.4.1/ConfigParser.html, 其他例子http://effbot.org/librarybook/configparser-example-1.py
   @authoer: U{119<mailto:[email protected]>}
   @version: $id$
'''
def iniTT(size_file):
    '''按照.ini的格式,存储size_file
    '''
    cfg = RawConfigParser()
    print size_file
    index = 1
    for (s, f) in size_file:
        cfg.add_section("%d" %index)
        cfg.set("%d" %index, 'Filename', f)
        cfg.set('%d' %index, 'FileSize', s)
        index += 1
    cfg.write(open('parseresult.txt','w'))
if __name__ == '__main__':
    if len(sys.argv) == 1:
        print 'usage:\n\tpython parseresult.py path'
    else:
        abs_path = os.path.abspath(sys.argv[1])
        if not os.path.isdir(abs_path):
            print '%s is not exist' % abs_path
        else:
            iniTT(get_top_three(abs_path))
    

 

运行结果【Python】CDay-1 优化!对自个的反省

parseresult.txt如下:

【Python】CDay-1 优化!对自个的反省

 

 

你可能感兴趣的:(【Python】CDay-1 优化!对自个的反省)