サイズの大きいファイルを見つけてグラフを出す

Lightweight Language Ring : キミならどう書く 2.0 – ROUND 3 –

今回のお題はグラフです.

いくつかのデータを与えたときにグラフを出力するプログラムを作ってください.細かい仕様はありません.

大したことは出来ないが、練習がてら「あるフォルダ内にあるサイズの大きいファイル」を幾つか出力するプログラムを作ってみる。

—–



以下のfilegraph.pyは、第一引数に指定したフォルダの下にある(サブフォルダも含む)ファイルのサイズを調べ、大きい順に第二引数に指定された個数表示する。その際に一番大きいサイズを*マーク50個として、相対グラフを出す。

filegraph.py

import os, sys, time
filedict = {}
limitNum = 0
def showSortedData(desc=True):
global filedict
list = []
for key in filedict.keys():
if len(list) < 1:
list.append(key)
else:
for item in list:
if filedict[key] > filedict[item]:
list.insert(list.index(item), key)
break
else:
list.append(key)
if not desc:
list.reverse()
maxValue = max(filedict.values())
print ''
for item in list:
print item, str(filedict[item]) + ' bytes'
num = (filedict[item] * 50) / maxValue
print '*' * num
print ''
def getFileSize(filename):
return os.stat(filename).st_size
def deleteMinValue(minsize):
global filedict
for key in filedict.keys():
if filedict[key] <= minsize:
del filedict[key]
break
def isBestTen(filesize):
global filedict, limitNum
if len(filedict) >= limitNum:
minsize = min(filedict.values())
if  filesize > minsize:
deleteMinValue(minsize)
return True
else:
return False
else:
return True
def addToDict(arg, dirname, names):
global filedict
for name in names:
filepath = dirname + os.sep + name
size = getFileSize(filepath)
if isBestTen(size):
filedict[filepath] = size
if __name__ == '__main__':
st = time.time()
try:
limitNum = int(sys.argv[2])
except:
limitNum = 5
if os.path.isdir(sys.argv[1]):
os.path.walk(sys.argv[1], addToDict, '')
else:
os.path.walk(os.getcwd(), addToDict, '')
showSortedData()
et = time.time()
print et - st

実行結果。

C:\Python24>python.exe filegraph.py C:\Python24 6
C:\python24\Doc\Python24.chm 3768458 bytes
**************************************************
C:\python24\python24.dll 1867776 bytes
************************
C:\python24\DLLs\tk84.dll 1031168 bytes
*************
C:\python24\DLLs\_bsddb.pyd 692224 bytes
*********
C:\python24\libs\libpython24.a 660400 bytes
********
C:\python24\DLLs\tcl84.dll 568320 bytes
*******
1.02200007439

見た目、速度ともにアルゴリズムが悪いせいでダメです。改善の余地大いにあり、というかもっと簡単にやる方法がいくらでもありそう。