2009-04-24 12 views
22

Szukam liczby wolnych bajtów na moim HD, ale mam problem z tym na python.Znajdź wolne miejsce na dysku w python na OS/X

Próbowałem następujące:

import os 

stat = os.statvfs(path) 
print stat.f_bsize * stat.f_bavail 

Ale na OS/X daje mi 17529020874752 bajtów, które jest o około 1,6 TB, co byłoby bardzo ładne, ale niestety nie do końca prawda.

Jaki jest najlepszy sposób, aby uzyskać tę liczbę?

+1

Podejście wieloplatformowy omówione http://stackoverflow.com/questions/51658/cross-platform-space-remaining -on-volume-using-python/2372171 # 2372171 –

Odpowiedz

35

Spróbuj użyć f_frsize zamiast f_bsize.

>>> s = os.statvfs('/') 
>>> (s.f_bavail * s.f_frsize)/1024 
23836592L 
>>> os.system('df -k /') 
Filesystem 1024-blocks  Used Available Capacity Mounted on 
/dev/disk0s2 116884912 92792320 23836592 80% /
+0

Nie wiem dlaczego, ale to działało tylko dla mnie, gdy zmieniłem rozmiar bloku (1024) na 512. – MFB

+1

Jakiej wersji OS/Python używasz? –

+0

To jest nieaktualna funkcja API. https://docs.python.org/2/library/statvfs.html#module-statvfs – JohnTortugo

-5

Co z

import subprocess 
proc= subprocess.Popen("df", stdout=subprocess.PIPE) 
proc.stdout.read() 
proc.wait() 
+4

Używanie prostego Pythona oznacza jego system operacyjny. :) – PKKid

+3

Jest kruchy, ponieważ opiera się na zewnętrznej aplikacji, aby utrzymać stałe formatowanie w przeciwieństwie do biblioteki systemowej. –

+0

To nie jest tak, że zaakceptowana odpowiedź jest również nieobsługiwana przez system operacyjny ... moja instalacja 2.6 w systemie Windows nie ma "os.statvfs". –

-1

To nie jest niezależny od systemu operacyjnego, ale to działa na Linux, a prawdopodobnie na OS X, a także: ('df').

druku commands.getoutput split ('\ n') [ 1] .split() [3]

Jak to działa? Otrzymuje wynik "df." polecenie, które podaje informacje o dysku, na którym znajduje się bieżący katalog, dzieli go na dwie linie (dokładnie tak, jak jest drukowane na ekranie), a następnie pobiera drugą linię (dodając [1] po pierwszy split()), a następnie dzieli , który linii na różne części oddzielające odstępy, a na końcu daje 4. element na tej liście.

>>> commands.getoutput('df .') 
'Filesystem   1K-blocks  Used Available Use% Mounted on\n/dev/sda3    80416836 61324872 15039168 81% /' 

>>> commands.getoutput('df .').split('\n') 
['Filesystem   1K-blocks  Used Available Use% Mounted on', '/dev/sda3    80416836 61324908 15039132 81% /'] 

>>> commands.getoutput('df .').split('\n')[1] 
'/dev/sda3    80416836 61324908 15039132 81% /' 

>>> commands.getoutput('df .').split('\n')[1].split() 
['/dev/sda3', '80416836', '61324912', '15039128', '81%', '/'] 

>>> commands.getoutput('df .').split('\n')[1].split()[3] 
'15039128' 

>>> print commands.getoutput('df .').split('\n')[1].split()[3] 
15039128 
+0

To podejście nie jest strasznie niezawodne, ponieważ nie ma przenośnej metody uzyskiwania strukturalnego wyjścia z 'df'. Na przykład po prostu spróbuj zamontować wolumin LVM lub NFS i zacznie on rozkładać wyniki na kilka linii. – conny

17

W systemie UNIX:

import os 
from collections import namedtuple 

_ntuple_diskusage = namedtuple('usage', 'total used free') 

def disk_usage(path): 
    """Return disk usage statistics about the given path. 

    Returned valus is a named tuple with attributes 'total', 'used' and 
    'free', which are the amount of total, used and free space, in bytes. 
    """ 
    st = os.statvfs(path) 
    free = st.f_bavail * st.f_frsize 
    total = st.f_blocks * st.f_frsize 
    used = (st.f_blocks - st.f_bfree) * st.f_frsize 
    return _ntuple_diskusage(total, used, free) 

Zastosowanie:

>>> disk_usage('/') 
usage(total=21378641920, used=7650934784, free=12641718272) 
>>> 

W systemie Windows można użyć psutil.

+0

Dziękuję za ten przepis! Myślę, że jest lepszy niż inne rozwiązania, które używają podprocesu i wywołują komendę 'df'. – guettli

+0

To jest nieaktualna funkcja API. https://docs.python.org/2/library/statvfs.html#module-statvfs – JohnTortugo

+0

Nie, nie jest. Zobacz komentarz do mojej odpowiedzi powyżej (https://stackoverflow.com/a/787832/6372). –

4

Psutil module może być również używany.

>>> psutil.disk_usage('/') 
usage(total=21378641920, used=4809781248, free=15482871808, percent=22.5) 

dokumentację można znaleźć here.

0
def FreeSpace(drive): 
    """ Return the FreeSape of a shared drive in bytes""" 
    try: 
     fso = com.Dispatch("Scripting.FileSystemObject") 
     drv = fso.GetDrive(drive) 
     return drv.FreeSpace 
    except: 
     return 0 
7

W Pythonie 3.3 i powyżej shutil zapewnia taką samą funkcję

>>> import shutil 
>>> shutil.disk_usage("/") 
usage(total=488008343552, used=202575314944, free=260620050432) 
>>> 
+0

działa, mały i elegancki, idealny (jeśli masz python 3.3+) – Hoto

Powiązane problemy