2009-04-24 12 views
22

Sto cercando il numero di byte liberi sul mio HD, ma ho problemi a farlo su python.Trova spazio su disco in python su OS/X

ho provato la seguente:

import os 

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

Ma, su OS/X mi dà un 17529020874752 byte, che è di circa circa 1,6 TB, che sarebbe molto bello, ma purtroppo non è proprio vero.

Qual è il modo migliore per raggiungere questa cifra?

+1

Un approccio multi-piattaforma discussa in http://stackoverflow.com/questions/51658/cross-platform-space-remaining -on-volume-using-python/2372171 # 2372171 –

risposta

35

Provate ad usare f_frsize invece di 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

Non so perché, ma questo ha funzionato solo con me quando ho cambiato la dimensione del blocco (1024) in 512. – MFB

+1

Quale versione di OS/Python stai usando? –

+0

Questa è API deprecata. https://docs.python.org/2/library/statvfs.html#module-statvfs – JohnTortugo

-5

Cosa c'è di sbagliato con

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

L'utilizzo di Python dritto indica il suo agnostico del sistema operativo. :) – PKKid

+3

È fragile poiché si basa su un'applicazione esterna per mantenere una formattazione costante rispetto a una libreria di sistema. –

+0

Non è come se la risposta accettata fosse agonostica per il sistema operativo ... o la mia installazione 2.6 su Windows non ha un 'os.statvfs'. –

-1

Non è indipendente dal sistema operativo, ma questo funziona su Linux, e probabilmente su OS X così: ('df').

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

Come funziona? Ottiene l'output di 'df.' comando, che ti dà informazioni sul disco sulla partizione di cui la directory corrente è una parte, la divide in due righe (proprio come viene stampata sullo schermo), quindi prende la seconda riga di quella (aggiungendo [1] dopo la prima split()), quindi divide quella riga in diversi pezzi separati da spazi bianchi e, infine, ti dà il 4 ° elemento in quella lista.

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

Questo approccio non è molto affidabile in quanto non esiste un metodo portatile per ottenere output strutturato da 'df'. Ad esempio, prova a montare un volume LVM o NFS e inizierà a rompere il suo output su più righe. – conny

17

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

Usage:

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

Per Windows è possibile utilizzare psutil.

+0

Grazie per questa ricetta! Penso che sia meglio delle altre soluzioni che usano il sottoprocesso e chiamano il comando 'df'. – guettli

+0

Questa è un'API deprecata. https://docs.python.org/2/library/statvfs.html#module-statvfs – JohnTortugo

+0

No, non lo è. Si prega di consultare il commento sulla mia risposta sopra (https://stackoverflow.com/a/787832/6372). –

4

Psutil module può anche essere utilizzato.

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

documentazione può essere trovato 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

in Python 3.3 e superiori shutil vi offre la stessa caratteristica

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

funziona, piccolo ed elegante, perfetto (se hai python 3.3+) – Hoto

Problemi correlati