Stack überlauf...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Stack überlauf...

Beitragvon DatenMetzgerX » Montag 12. Juni 2006, 09:47

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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 12. Juni 2006, 10:07

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!
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Beitragvon Masaru » Montag 12. Juni 2006, 19:10

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<<

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder