【问题标题】:Order a list of files by size via python通过python按大小排序文件列表
【发布时间】:2010-12-25 03:28:41
【问题描述】:

目录列表中的示例转储:

hello:3.1 GB
world:1.2 MB
foo:956.2 KB

以上列表的格式为FILE:VALUE UNIT。如何根据文件大小对上面的每一行进行排序?

我想也许可以通过模式“:VALUE UNIT”(或以某种方式使用分隔符)解析单元的每一行,然后通过ConvertAll engine 运行它,以字节为单位接收每个值的大小,用该行的其余部分(文件名),然后通过大小对生成的字典对进行排序。

麻烦的是,我对模式匹配一​​无所知。但我看到你可以排序dictionary

如果有更好的解决这个问题的方向,请告诉我。


编辑:

我的列表实际上在一个文件中。从(真棒)Alex Martelli 的回答中汲取灵感,我编写了以下代码,从一个文件中提取、排序并写入另一个文件。

#!/usr/bin/env python

sourceFile = open("SOURCE_FILE_HERE", "r")
allLines = sourceFile.readlines()
sourceFile.close()

print "Reading the entire file into a list."

cleanLines = []

for line in allLines:
    cleanLines.append(line.rstrip())

mult = dict(KB=2**10, MB=2**20, GB=2**30)

def getsize(aline):
  fn, size = aline.split(':', 1)
  value, unit = size.split(' ')
  multiplier = mult[unit]
  return float(value) * multiplier

print "Writing sorted list to file."

cleanLines.sort(key=getsize)

writeLines = open("WRITE_OUT_FILE_HERE",'a')

for line in cleanLines:
    writeLines.write(line+"\n")

writeLines.close()

【问题讨论】:

    标签: python arrays hash dictionary


    【解决方案1】:
    thelines = ['hello:3.1 GB', 'world:1.2 MB', 'foo:956.2 KB']
    
    mult = dict(KB=2**10, MB=2**20, GB=2**30)
    
    def getsize(aline):
      fn, size = aline.split(':', 1)
      value, unit = size.split(' ')
      multiplier = mult[unit]
      return float(value) * multiplier
    
    thelines.sort(key=getsize)
    print thelines
    

    根据需要发出['foo:956.2 KB', 'world:1.2 MB', 'hello:3.1 GB']。当然,如果 KB、MB 和 GB 没有用尽您感兴趣的单位集,您可能必须向 mult 添加一些条目。

    【讨论】:

    • 7 年后仍然非常有用。谢谢
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2021-11-21
    • 2022-10-15
    • 2015-10-21
    • 2016-10-03
    相关资源
    最近更新 更多