ubuntuusers.de

[Python] Ordnergröße ermitteln

Status: Gelöst | Ubuntu-Version: Ubuntu 8.10 (Intrepid Ibex)
Antworten |

nexonic

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Hi,

kann man mit dem Python os-Modul auch die Größe eines Ordners ermitteln? os.path.getsize(ordner) gibt mir irgendwie immer 4096L.

– N3X0NIC

MrKanister

Anmeldungsdatum:
13. Oktober 2007

Beiträge: 2105

Hallo N3X0NIC,

die größe eines Ordners beträgt immer 4 KB (bzw. es hängt glaube ich vom Dateisystem ab). Was du willst ist aber die größe des Inhalts.

Ich hab mal eben mit "os.walk" was zusammengewürfelt, ich weiß allerdings nicht, wie sich das ganze verhält, wenn noch symbolische links dabei sind.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/usr/bin/python

import os

os.chdir("/home/martin/Desktop/")

size_dateien = 0
size_ordner = 0

for dirpath, dirnames, filenames in os.walk("eltern"):
    size_dateien += sum(os.path.getsize(os.path.join(dirpath, datei)) for datei in filenames)
    size_ordner += sum(os.path.getsize(os.path.join(dirpath, ordner)) for ordner in dirnames)

size_in_kb = (size_dateien + size_ordner) / 1024

print size_in_kb, "kb"

Gruß Martin

toddy Team-Icon

Ikhayateam
Avatar von toddy

Anmeldungsdatum:
31. Juli 2007

Beiträge: 9522

Wohnort: Lüneburg

Hi,

ganz so trivial ist das dann doch nicht.

Du kannst Dir zwar mit folgenden Befehl die Größe des Verzeichnisses mit den darinliegenden Dateien anzeigen lassen:

print "size: %.2f" % (os.path.getsize(outdir))

aber das geht nicht rekusiv weiter.

Aber hier gibt es ein kleines Skript, welches die Arbeit erledigen sollte: http://www.icoost.com/programmiersprachen/python/python-verzeichnisgrose-ermitteln/

Gruß

Torsten

nexonic

(Themenstarter)

Anmeldungsdatum:
23. Januar 2008

Beiträge: 952

Ok, danke.

Habe mir mithilfe eurer und anderer Codeschnipsel/Skripts mal das gebaut:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/python

# stdlib
import os
import sys


def iter_files(path):
    files = []

    for root, dirs, filenames in os.walk(path):
        for filename in filenames:
           files.append(os.path.join(root, filename))

    return files

def get_dir_size(directory):
    files = iter_files(directory)
    dir_size = 0

    for file in files:
        dir_size += os.path.getsize(file)
    
    return dir_size


if len(sys.argv[1:]) < 1 or len(sys.argv[1:]) > 1:
    print 'USAGE: ./chkdir.py $PATH'
else:
    path = sys.argv[1]
    size_b = get_dir_size(path)
    size_kb = size_b / 1024
    size_mb = size_kb / 1024
    print '%s Bytes' % size_b
    print '%s Kilobytes' % size_kb
    print '%s Megabytes' % size_mb

– N3X0NIC

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

iter_files gibt eine Liste und keinen Iterator zurück, der Name ist also irreführend. Statt einer Liste wäre es besser, jeden gefundenen Dateinamen direkt per yield zurückzugeben. Das dürfte bei großen Verzeichnissen auch um einiges schneller sein. Desweiteren behandelst du symbolische Links nicht gesondert, was das Ergebnis verfälscht bzw. bei toten Links zu Ausnahmen führt.

Ich habe mal eine Python-Version von du im Netz gefunden, evtl. hilft dir das ja weiter.

Ferio Team-Icon

Avatar von Ferio

Anmeldungsdatum:
24. April 2007

Beiträge: 383

Und außerdem steht Kilo immer noch für 1000. *SCNR* 😉

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Laut Wikipedia ist das allerdings nicht wirklich einheitlich geregelt. Es ist auf jeden Fall schöner »MiB« für Mebibyte, »Mib« für Mebibit, »MB« für Megabyte und »Mb« für Megabit zu schreiben.

Aber das ist »eigentlich« nicht das Thema, daher verschwinde ich mal wieder, Grüße, Keba.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Keba schrieb:

Laut Wikipedia ist das allerdings nicht wirklich einheitlich geregelt.

Wo hast du das denn in diesem Artikel gelesen? 😉 Eigentlich steht da doch, dass die Binäreinheiten sehr eindeutig über eine internationale Norm geregelt sind ...

Keba Team-Icon

Ehemalige
Avatar von Keba

Anmeldungsdatum:
24. Juli 2007

Beiträge: 3802

Auch bis heute ist nur eine sehr langsam zunehmende Akzeptanz und Verbreitung festzustellen.

Vielleicht ist »einheitlich« kein wirklich guter Ausdruck. Was ich meinte ist, dass Megabyte oft eben für 1.048.576 Byte steht. So weiß man oft einfach nicht, was ein »Megabyte« nun heißt. Schlimmer wirds bei Giga- oder Terrabyte, da die Unterschiede dann eben recht groß sind. So passt eine 70 Gibibyte große Filme-Sammlung nicht auf eine 80 Gigabyte große Festplatte...

Antworten |