2009-12-10 6 views
1

dump Exemple de la liste d'un répertoire:Commander une liste de fichiers par taille via python

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

La liste ci-dessus est dans le format de FICHIER: VALEUR UNITÉ. Comment procéder pour commander chaque ligne ci-dessus en fonction de la taille du fichier? Je pensais peut-être analyser chaque ligne pour l'unité via le modèle ": VALUE UNIT" (ou en quelque sorte utiliser le délimiteur) puis l'exécuter à travers le ConvertAll engine, recevoir la taille de chaque valeur en octets, le hacher avec le reste de la ligne (noms de fichiers), puis ordonner les paires de dictionnaire résultant par taille.

Le problème est, je n'ai aucune idée de la correspondance de modèle. Mais je vois que vous pouvez trier un dictionary

S'il ya une meilleure direction pour résoudre ce problème, s'il vous plaît faites le moi savoir.


EDIT:

La liste que j'avais était en fait dans un fichier. En m'inspirant de la réponse du (génial) Alex Martelli, j'ai écrit le code suivant qui extrait d'un fichier, le commande et l'écrit à un autre.

#!/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() 

Répondre

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 

émet ['foo:956.2 KB', 'world:1.2 MB', 'hello:3.1 GB'], comme on le souhaite. Vous devrez peut-être ajouter quelques entrées à mult si KB, MB et GB n'épuisent pas votre ensemble d'unités d'intérêt bien sûr.

+0

Semplicemente génie! – torger

+1

+1 Vous êtes vraiment un grand maître Python. – helpermethod

+0

Toujours extrêmement utile 7 ans plus tard. Je vous remercie –

Questions connexes