首页 > 代码库 > 按字典值排序--找出大小最大的十个文件

按字典值排序--找出大小最大的十个文件

问题分析:

  1. 需要确认某路径下所有文件的大小

  2. 需要排序,找出最大的十个

  3. 以字典的形式保存数据


准备知识:

  1. operator模块:

   fun = operator.itemgetter(1), fun 是一个由operator.itemgetter(1) 返回的函数,当函数fun作用在某个对象时,返回被作用的对象的第1维的值。例如:

   lis = (6, 56)

   fun(lis) # 返回lis[1]

   注意:operator.itemgetter(1) 并不返回值,返回的是函数,当函数作用在对象时,才会返回对象在某个序号位置的值。


2. sorted 排序函数

  sorted(iterable[,cmp [,key [,reverse ] ] ] )

  参数iterable ,指定要进行排序的对象list 或者iterable对象

  参数cmp 和key 都是函数,指定排序时,用的比较函数。cmp指定的是两个参数的函数,key为一个参数。

  参数reverse 如果为True时,则反向排序


  其实cmp和key的作用都一样,如果用cmp ,则可以使用一个lambda函数,如:

 

lis= [(1, 2), (2, 4), (5, 3)]
fcmp = lambda x, y: cmp(x[1], y[1])
sorted_lis = sorted(lis, cmp=fcmp)
print sorted_lis

 最后,输出[(1, 2), (5, 3), (2, 4)] ,以每个成员的第二个维度进行排序。其实就是fcmp比较函数了x[1]和y[1]指定了比较的就是lis每个成员的第二个维度的值。fcmp 本身没有值返回,当它在sorted()函数里,作用于每个lis的成员时,才有值。


 如果用key 指定比较函数,也可以,但key 指定的时比较时使用对象的哪一维度。如:

 

lis= [(1, 2), (2, 4), (5, 3)]
sorted_lis = sorted(lis, key=operator.itemgetter(1))
print sorted_lis

最后,输出也是[(1, 2), (5, 3), (2, 4)],就是因为operator.itemgetter(1)也是一个函数,它作用于对象时返回对象的第二个维度的值,当作用于lis时,每次都返回的时lis每个成员的第二维度。这里它指定用lis每个成员的第二维度作为比较。


3. os.walk(topdir):

  os.walk 模块递归遍历目录下的所有子目录和文件,返回一个迭代器,遍历它的时候,每次都会返回一个包含三个tuple 的列表,三个tuple 分别代表顶层目录,顶层目录下一层的所有子目录,顶层目录当前的所有文件,如:

这是/root/devops 路径的目录数

技术分享


用os.walk() 可以遍历整个路径

技术分享

  通过遍历os.walk(‘/root/devops‘) 返回的迭代器,就能遍历以/root/devops 作为顶层目录下的所有文件了。每次返回的序列第三个元素就是文件了,只要和第一个元素组合,就是文件的绝对路径了。


4. 用什么数据将结果保存?

 由于,想同时知道文件名,和文件对应的大小,可以考虑用字典来保存文件的信息。最后,再对字典进行排序。


有了以上准备知识,就可以实现遍历文件,计算大小,再进行排序了。

#/usr/bin/env  python

import os
import sys
import operator


def   gen_dic(topdir):
    dic = {}
    a = os.walk(topdir)
    for p, d, f in a:
        for i in f:
            f_name = os.path.join(p, i)
            f_size = os.path.getsize(f_name)
            dic[f_name] = f_size
    return dic
    
    
if __name__ == "__main__":
    try:
        dic = gen_dir(sys.argv[1]) #遍历目录,将所有的文件和文件大小进行统计,保存到字典里
    except IndexError:
        print "%s follow a dir" % __file__
        sys.exit()
    sorted_dic = sorted(dic.iteritems(), key=operator.itemgetter(1), reverse=True) #sorted()方法进行排序
    for k, v in sorted_dic[:10]:
        print k, ‘--->‘, v





本文出自 “dayAndNight” 博客,请务必保留此出处http://hellocjq.blog.51cto.com/11336969/1862148

按字典值排序--找出大小最大的十个文件