Python: 'count'を使って行の量を制限しようとすると "print"が出力されます

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

私は印刷出力を制限するために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()
0
追加された
ビュー: 1

5 答え

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

4
追加された
ありがとうレイモンド、はい - それを見て、ホイールを再開発することが嫌い。
追加された 著者 jed,

mycnt が整数ではなく文字列であれば( sys.argv から直接読み取ると)、ループは終了しません。

3
追加された
ああ...はい、ありがとうございました...それを完全に見落としました。 "mycnt = int(mycnt)"を追加しました
追加された 著者 jed,

while の代わりに if を使用する必要があります。

You want to exit the program if count <= mycnt.

2
追加された
あなたを助ける答えをupvoteに自由に感じてください。それは、SOがすべてについてです。
追加された 著者 Hamish,
固定、ありがとうございます。
追加された 著者 jed,

Larry Lustig has already hit the nail on the head regarding mycnt, but your check to see if you've hit the limit is also wrong (as Hamish points out).

Rather than if (count <= mycnt):, you could use a slice like [:maximum], removing the need for the count variable. Speaking of variables, I suggest that you would benefit from some better-named variables. Viz:

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

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

countmycnt を過ぎると while ループが終了し、 for ループのanoter反復が実行されます。あなたは for ループに時間がかかることがあります。

1
追加された
あなたはそのキャッチのために正直な感謝です...
追加された 著者 jed,