Python: als u 'aantal' probeert te gebruiken om het aantal regels te beperken, wordt 'afdrukken' uitgevoerd

Ik heb een script dat een systeemmap zal openen en de bestandsgroottes in die map zal krijgen. het sorteert vervolgens op bestandsgrootte (aflopend), neemt twee argumenten. De eerste arg is het systeempad en de tweede arg is een geheel getal om de uitvoer te beperken tot dat gehele aantal.

Ik gebruik een while-lus om de afdruk te beperken, maar het komt vast te zitten in een oneindige lus .... natuurlijk, er is iets mis, maar ik kan het niet zien.

#!/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

5 antwoord

FWIW, de module rep heeft hulpmiddelen om een lijst weergeven terwijl het aantal regels van uitvoer wordt beperkt.

4
toegevoegd
bedankt Raymond, ja - zal zeker kijken naar dat ... haat het om het wiel opnieuw uit te vinden.
toegevoegd de auteur jed, de bron

Als mycnt een tekenreeks is, geen geheel getal (wat het is wanneer het rechtstreeks wordt gelezen van sys.argv ), zal uw lus nooit eindigen.

3
toegevoegd
ahhh ... toch, bedankt ... volledig over het hoofd gezien. "mycnt = int (mycnt)" toegevoegd
toegevoegd de auteur jed, de bron

U moet een if hebben in plaats van terwijl .

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

2
toegevoegd
voel je vrij om de antwoorden die je helpen bij te werken .. dat is waar het allemaal om gaat :)
toegevoegd de auteur Hamish, de bron
gefixeerd, bedankt Harnish.
toegevoegd de auteur jed, de bron

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
toegevoegd
Jonny, heel erg bedankt dat je me een schonere manier hebt getoond - zeer gewaardeerd. Ja, ik ben het eens met de variabele namencommentaar, ik heb altijd moeite om namen te bedenken - en leun naar de meer obscure namen. Ook had ik geen idee dat ik sys.argv in int() kon gooien - I LOVE python :-D
toegevoegd de auteur jed, de bron

U hebt de else -clausule toegevoegd aan de lus while . Het wordt alleen uitgevoerd als de lus while nooit wordt uitgevoerd.

Uw while -lus wordt afgesloten met count toeneemt voorbij mycnt , en anoter iteratie van voor lus wordt uitgevoerd. Mabe merk je het gewoon niet - je voor lus kan lang duren.

1
toegevoegd
Je hebt gelijk, bedankt voor de vangst van die ...
toegevoegd de auteur jed, de bron