Python: попытка использовать 'count' для ограничения количества строк, которые выводит "print" - PullRequest
0 голосов
/ 12 ноября 2011

У меня есть скрипт, который будет обходить системный каталог и получать размеры файлов в этом каталоге. затем сортируется по размеру файла (по убыванию), принимает два аргумента. Первый аргумент - системный путь, а второй аргумент - целое число, ограничивающее вывод целым числом.

Я использую цикл 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()

Ответы [ 5 ]

4 голосов
/ 12 ноября 2011

FWIW, модуль repr имеет инструменты для отображения списка при ограничении количества строк вывода.

3 голосов
/ 12 ноября 2011

Если mycnt является строкой, а не целым числом (как при чтении непосредственно из sys.argv), ваш цикл никогда не закончится.

2 голосов
/ 12 ноября 2011

Вы должны иметь if вместо while.

Вы хотите выйти из программы , если count <= mycnt.

1 голос
/ 12 ноября 2011

Ларри Люстиг уже ударил по гвоздю по голове относительно mycnt, но ваша проверка на то, что вы достигли лимита, также неверна (как Хэмиш указывает на ).

Вместо if (count <= mycnt): можно использовать срез , как [:maximum], устраняя необходимость в переменной 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)
1 голос
/ 12 ноября 2011

Вы добавили предложение else в цикл while.Он будет выполняться только в том случае, если цикл while никогда не будет выполнен.

Ваш цикл while завершается, когда count увеличивается после mycnt и выполняется повторная итерация цикла for.Мэйб, ты просто не замечаешь этого - твой цикл for может занять много времени.

...