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

问题分析:

  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
时间: 2024-09-29 22:08:33

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

Python字典按值排序、包含字典的列表按字典值排序的方法

#-*- encoding=utf-8 -*- import operator #按字典值排序(默认为升序) x = {1:2, 3:4, 4:3, 2:1, 0:0} sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1)) print sorted_x #[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)] #如果要降序排序,可以指定reverse=True sorted_x = sorted(x.i

找出目录中相同的文件

这个功能,笔者是使用python实现.执行脚本后,根据提示手动输入目录的路径.脚本计算该目录及其子目录中所包含文件的md5值,比对md5值,从而打印出md5值相同的文件路径. python完整脚本如下: # -*- coding: utf-8 -*- def calmd5(filename): import hashlib f = open(filename,'rb') m = hashlib.md5() m.update(f.read()) hash = m.hexdigest() retur

PHP判断数组中是否有重复值并找出重复值

可以用来测试需要唯一凭据号码的,是否有重复值,不过一般直接使用uuid了,简单粗暴就解决问题,这个就简单的测试生成的数据是否有重复值吧 <?php /* * @Author: wyy * @Date: 2019-01-09 13:34:16 * @Email: [email protected] * @Last Modified by: wyy * @Last Modified time: 2019-01-09 13:48:39 */ /** * 生成抽奖好 * @method build_ra

Linux/Unix 怎样找出并删除某一时间点的文件(转)

在Linux/Unix系统中,我们的应用每天会产生日志文件,每天也会备份应用程序和数据库,日志文件和备份文件长时间积累会占用大量的存储空间,而有些日志和备份文件是不需要长时间保留的,一般保留7天内的文件即可,那么我们怎么找出并删除7天前产生的日志文件和备份文件并将其删除呢? Linux/Unix提供了find 操作系统命令,使用该命令可以实现我们的目标. $man find 可以查看find命令的使用方法. 1. 找出 n 天前的文件 $find /temp/ -type f -mtime +n

Linux/Unix 怎样找出并删除某一时间点的文件

Linux/Unix 怎样找出并删除某一时间点的文件 在Linux/Unix系统中,我们的应用每天会产生日志文件,每天也会备份应用程序和数据库,日志文件和备份文件长时间积累会占用大量的存储空间,而有些日志和备份文件是不需要长时间保留的,一般保留7天内的文件即可,那么我们怎么找出并删除7天前产生的日志文件和备份文件并将其删除呢? Linux/Unix提供了find 操作系统命令,使用该命令可以实现我们的目标.$man find 可以查看find命令的使用方法.1. 找出 n 天前的文件 $find

Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件

题目为: 有一百个图片文件,它们的地址都是http://down.fengge.com/img/1.pnghttp://down.fengge.com/img/2.png-一直到http://down.fengge.com/img/100.png批量下载这100个图片文件,并找出其中大于200KB的文件. 这个使用shell脚本实现 #!/bin/bash for i in {1..100} do wget http://down.fengge.com/img/$i.png done find

剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

/*给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4.*//*二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值*///思路:从最左边的叶子节点开始找起. import java.util.*; public clas

机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的文本str格式,loc表示文本在图中的位置,font_size可以使用cv2.FONT_HERSHEY_SIMPLEX, font_scale表示文本的规格,color表示文本颜色,linestick表示线条大小 信用卡数字识别: 信用卡      数字模板涉及到的内容:主要是采用模板匹配的思想 思

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简