Espacio multiplataforma restante en el volumen usando python
windows linux (11)
Si está ejecutando python3:
El uso de shutil.disk_usage()
con os.path.realpath(''/'')
nombre-regularización funciona:
from os import path
from shutil import disk_usage
print([i / 1000000 for i in disk_usage(path.realpath(''/''))])
O
total_bytes, used_bytes, free_bytes = disk_usage(path.realpath(''D://Users//phannypack''))
print(total_bytes / 1000000) # for Mb
print(used_bytes / 1000000)
print(free_bytes / 1000000)
dándote el espacio total, usado y libre en MB.
Necesito una forma de determinar el espacio que queda en un volumen de disco usando Python en Linux, Windows y OS X. Actualmente estoy analizando el resultado de varias llamadas al sistema (df, dir) para lograr esto, ¿hay alguna otra manera mejor?
A continuación, el código devuelve el valor correcto en Windows
import win32file
def get_free_space(dirname):
secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
return secsPerClus * bytesPerSec * nFreeClus
Desde Python 3.3 puede usar shutil.disk_usage("/").free de la biblioteca estándar tanto para Windows como para UNIX :)
Instala psutil usando pip install psutil
. Luego puede obtener la cantidad de espacio libre en bytes usando:
import psutil
print(psutil.disk_usage(".").free)
La función os.statvfs() es una mejor manera de obtener esa información para plataformas tipo Unix (incluido OS X). La documentación de Python dice "Disponibilidad: Unix", pero vale la pena comprobar si también funciona en Windows en tu compilación de Python (es decir, es posible que los documentos no estén actualizados).
De lo contrario, puede usar la biblioteca pywin32 para llamar directamente a la función GetDiskFreeSpaceEx .
No conozco ninguna forma de plataforma cruzada para lograr esto, pero tal vez una buena solución para usted sería escribir una clase contenedora que verifique el sistema operativo y use el mejor método para cada una.
Para Windows, existe el método GetDiskFreeSpaceEx en las extensiones de win32.
Puede usar df como una forma multiplataforma. Es una parte de las utilidades centrales de GNU . Estas son las utilidades principales que se espera que existan en todos los sistemas operativos. Sin embargo, no están instalados en Windows por defecto (Aquí, GetGnuWin32 es útil).
df es una utilidad de línea de comandos, por lo tanto, se requiere un contenedor para propósitos de scripting. Por ejemplo:
from subprocess import PIPE, Popen
def free_volume(filename):
"""Find amount of disk space available to the current user (in bytes)
on the file system containing filename."""
stats = Popen(["df", "-Pk", filename], stdout=PIPE).communicate()[0]
return int(stats.splitlines()[1].split()[3]) * 1024
Puede usar el módulo wmi para windows y os.statvfs para Unix
para ventana
import wmi
c = wmi.WMI ()
for d in c.Win32_LogicalDisk():
print( d.Caption, d.FreeSpace, d.Size, d.DriveType)
para Unix o Linux
from os import statvfs
statvfs(path)
Si no desea agregar otra dependencia, puede usar ctypes para Windows para llamar directamente a la función win32.
import ctypes
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(u''c://'), None, None, ctypes.pointer(free_bytes))
if free_bytes.value == 0:
print ''dont panic''
Una buena forma de plataforma cruzada es usar psutil: http://pythonhosted.org/psutil/#disks (Tenga en cuenta que necesitará psutil 0.3.0 o superior).
import ctypes
import os
import platform
import sys
def get_free_space_mb(dirname):
"""Return folder/drive free space (in megabytes)."""
if platform.system() == ''Windows'':
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes))
return free_bytes.value / 1024 / 1024
else:
st = os.statvfs(dirname)
return st.f_bavail * st.f_frsize / 1024 / 1024
Tenga en cuenta que debe pasar un nombre de directorio para que GetDiskFreeSpaceEx()
funcione ( statvfs()
funciona tanto en archivos como en directorios). Puede obtener un nombre de directorio de un archivo con os.path.dirname()
.
También vea la documentación para os.statvfs()
y GetDiskFreeSpaceEx
.