通过Python按大小排序文件列表

1 投票
1 回答
1982 浏览
提问于 2025-04-15 16:52

下面是一个目录列表的示例:

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

这个列表的格式是 文件名:值 单位。我们该如何根据文件大小来排序每一行呢?

我想也许可以通过模式 ":值 单位" 来解析每一行(或者用分隔符),然后把它传给 ConvertAll 引擎,这样就能得到每个值的字节大小,再把它和其他信息(文件名)结合在一起,然后根据大小来排序这些结果。

问题是,我对模式匹配一点都不了解。不过我看到可以对一个 字典 进行排序。

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


编辑:

我手上的列表其实是在一个文件里。受到(很棒的) 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()

1 个回答

10
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 中添加一些其他的单位。

撰写回答