2011-11-12 17 views
0

私はシステムディレクトリを歩き回り、そのディレクトリ内のファイルサイズを取得するスクリプトを持っています。ファイルサイズ(降順)でソートし、2つの引数をとります。最初のargはシステムパスで、2番目のargは出力をその整数カウントに制限する整数です。Python: 'count'を使って行数を制限しようとすると "print"が出力されます

私は印刷出力を制限するためにwhileループを使用していますが、そのループは無限ループに陥っています....明らかに、何かが間違っていますが、私はそれを見ません。

#!/usr/bin/python 

import sys 
import os 

#Grab arguments 
mydir = sys.argv[1] 
mycnt = sys.argv[2] 

print mydir 
print mycnt 
#set base dir 
root_path = mydir 


fileSize = 0 
rootdir = mydir 
filedict = dict() 
count = 0 

for root, dirs, files in os.walk(rootdir): 
    for file in files: 
     filepath = os.path.join(root,file) 
     filesize = fileSize + os.path.getsize(filepath) 
     filedict[filepath] = filesize 


for key, value in sorted(filedict.iteritems(), key=lambda (key,val): (val,key), reverse=True): 
    while (count <= mycnt): 
     print "(%8s)" "  (%-8s)" % (value, key) 
     count += 1 
    else: 
     sys.exit() 

答えて

3

mycntが文字列ではなく、(sys.argvから直接読んだとき、それはある)の整数である場合は、あなたのループが終了することはありません。

+0

ああ....権利は、完全にそれを見落として...ありがとうございます。 "mycnt = int(mycnt)"を追加しました。 – jed

2

whileの代わりにifが必要です。

あなたはcount <= mycnt場合、プログラムを終了します。

+0

固定、ありがとうございます。 – jed

+1

あなたを助ける答えをupvoteに自由に感じてください。それはまさにSOのことです:) – Hamish

1

else句をループのwhileに追加しました。 whileループが実行されない場合にのみ実行されます。

あなたwhileループがmycnt過去count増加すると終了し、forループのanoter反復が実行されます。あなたはただそれに気づかないのです。あなたのforループが長くかかるかもしれません。

+0

あなたはそのキャッチのために正しいですね... – jed

4

FWIW、reprモジュールには、出力行数を制限しながらリストを表示するツールがあります。

+0

感謝レイモンド、はい - それを見てください...嫌いでしょ車輪を再構築する必要があります。 – jed

1

Larry Lustig has already hit the nail on the headについては、mycntですが、上限に達したかどうかの確認も間違っています(Hamish points outなど)。

if (count <= mycnt):ではなく、[:maximum]のようにsliceを使用して、count変数を削除する必要があります。変数について言えば、より良い名前の変数の恩恵を受けることをお勧めします。 ビズ

#!/usr/bin/env python 

import sys 
import os 

rootdir = sys.argv[1] 
maximum = int(sys.argv[2]) 

print 'Printing the biggest ', maximum, 'files in', rootdir, '...' 

filedict = {} 
for root, _, files in os.walk(rootdir): 
    for filename in files: 
     filepath = os.path.join(root, filename) 
     filesize = os.path.getsize(filepath) 
     filedict[filepath] = filesize 

sorted_by_size = sorted(filedict.iteritems(), key=lambda(path, size): (size, path), reverse=True) 
for path, size in sorted_by_size[:maximum]: 
    print "(%8s)  (%-8s)" % (size, path) 
+0

ジョニー、私に清潔な方法を教えてくれてありがとう - 非常に感謝しています。はい、私は変数名のコメントに同意します、私はいつも名前を思いつくのに困っています - そしてより曖昧な名前に傾けます。また、私はint()にsys.argvを投げることができないということを知りませんでした - 私はPythonを愛しています: - D – jed

関連する問題