Seite 1 von 1

Stack überlauf...

Verfasst: Montag 12. Juni 2006, 09:47
von DatenMetzgerX
Hallo

Wollte ein kleines Script erstellen, welches mir die Grösse jedes Ordners ausgibt.

Code: Alles auswählen

def GetSize(file, Dir):
    size = 0L
    if Dir == 'C:\\':
        DirFile = 'C:\\'
    else:
        DirFile = Dir + os.sep + file
    for File in os.listdir(DirFile):
        if os.path.isdir(DirFile + os.sep + File):
            size+=GetSize(File, DirFile)
        else:
            size+=os.path.getsize(DirFile + os.sep + File)
    print '%s\t\t%l' %(DirFile, size)    
    return size

if __name__ == '__main__':
    GetSize('', 'C:\\')
Weiss, hätte anstatt dir und File auch einfach direkt den Pfad nehmen können.

Nur, wie kann ich den Stack overflow umgehen?

Gruess
DM

Verfasst: Montag 12. Juni 2006, 10:07
von Rebecca
Ein "Stack overflow" kommt zu stande, wenn man eine Funktion zu oft rekursiv aufruft. Also stimmt meistens was mit der Abbruchbedingung oder dem rekursiven Aufruf nicht (es ist extrem unwahrscheinlich, dass du so tief verschachtelte Ordner hast, dass deine Funktion zwar richtig ist, aber es trotzdem zum "Stack overflow" kommt.). Hatte keine Lust, die Pfade in deinem Programm an Linux anzupassen und es selbst auszuprobieren, aber ich wuerde mal sowas wie

Code: Alles auswählen

raw_input(DirFile + os.sep + File)
zwischen Zeile 8 und 9 einfuegen.

Schau dir uebrigens mal os.walk und os.path.join an!

Verfasst: Montag 12. Juni 2006, 19:10
von Masaru
Hab mal vor einiger Zeit etwas mit os.walk rumexperimentiert.

Vielleicht hilft dir das ja weiter:

Code: Alles auswählen


>>> import os
>>> 
>>> def getInfoDir(dirpath):
... 	count_dirs = 0
... 	count_files = 0
... 	count_size = 0
... 	assert os.path.isdir(dirpath), "Target '%s' is not a directory path" % dirpath
... 	for root, dirs, files in os.walk(dirpath):
... 		count_dirs += len(dirs)
... 		count_files += len(files)
... 		for f in files:
... 			count_size += os.path.getsize(os.path.join(root, f))
... 	return count_dirs, count_files, count_size
... 
>>> getInfoDir(r'd:\work')
(39, 422, 8132299L)
Gruß,
>>Masaru<<