问题分析:
- 需要确认某路径下所有文件的大小
- 需要排序,找出最大的十个
- 以字典的形式保存数据
准备知识:
- 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