2009-04-24 22 views
22

Estoy buscando la cantidad de bytes libres en mi HD, pero tengo problemas para hacerlo en python.Buscar espacio en disco libre en python en OS/X

He intentado lo siguiente:

import os 

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

Pero, en OS/X me da una 17529020874752 bytes, que es aproximadamente alrededor de 1,6 TB, lo que sería muy agradable, pero por desgracia no es realmente cierto.

¿Cuál es la mejor manera de llegar a esta cifra?

+1

Un enfoque multiplataforma discute en http://stackoverflow.com/questions/51658/cross-platform-space-remaining -on-volume-using-python/2372171 # 2372171 –

Respuesta

35

Trate de usar f_frsize en lugar de 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

No estoy seguro por qué, pero esto solo funcionó para mí cuando cambié el tamaño de bloque (1024) a 512. – MFB

+1

¿Qué versión de OS/Python está usando? –

+0

Esto es API obsoleta. https://docs.python.org/2/library/statvfs.html#module-statvfs – JohnTortugo

-5

¿Qué hay de malo en

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

El uso de Python directo significa su agnóstico de sistema operativo. :) – PKKid

+3

Es frágil ya que depende de una aplicación externa para mantener un formato constante en lugar de una biblioteca del sistema. –

+0

No es que la respuesta aceptada sea ajena al sistema operativo tampoco ... mi instalación 2.6 en Windows no tiene un 'os.statvfs'. –

-1

No es independiente del sistema operativo, pero esto funciona en Linux, y probablemente en OS X, así: ('df').

commands.getoutput impresión de división ('\ n') [ 1] .split() [3]

¿Cómo funciona? Obtiene la salida del 'df'. comando, que le da información del disco sobre la partición de la cual el directorio actual es parte, la divide en dos líneas (tal como se imprime en la pantalla), luego toma la segunda línea de eso (al agregar [1] después del primero divide()), luego divide esa línea en diferentes piezas separadas por espacios en blanco, y, finalmente, te da el 4 ° elemento en esa 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

Este enfoque no es muy confiable ya que no hay un método portátil para obtener salida estructurada de 'df'. Por ejemplo, intente montar un volumen LVM o NFS y comenzará a interrumpir su salida en varias líneas. – conny

17

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

Uso:

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

Para Windows puede utilizar psutil.

+0

¡Gracias por esta receta! Creo que es mejor que las otras soluciones que usan subproceso y llaman al comando 'df'. – guettli

+0

Esto es API obsoleta. https://docs.python.org/2/library/statvfs.html#module-statvfs – JohnTortugo

+0

No, no lo es. Por favor, vea el comentario en mi respuesta anterior (https://stackoverflow.com/a/787832/6372). –

4

Psutil module también se puede utilizar.

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

documentación se puede encontrar 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

en Python 3.3 y por encima de shutil le proporciona la misma característica

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

funciona, pequeño y elegante, perfecto (si tienes Python 3.3+) – Hoto

Cuestiones relacionadas