2009-12-10 5 views
1

예 덤프를 통해 크기별로 파일 목록 : 값 단위 :주문 디렉토리 목록에서 파이썬

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

위의 목록은 FILE의 형식으로되어 있습니다. 파일 크기에 따라 위의 각 줄을 어떻게 주문합니까?

아마도 ": 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() 

답변

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에 항목을 추가해야 할 수도 있습니다.

+0

천재성! – torger

+1

+1 진정한 파이썬 그랜드 마스터입니다. – helpermethod

+0

7 년 후 여전히 매우 도움이됩니다. 고맙습니다 –

관련 문제