Функция os.statvfs () - лучший способ получить эту информацию для Unix-подобных платформ (включая OS X). В документации Python указано «Доступность: Unix», но стоит проверить, работает ли он и в Windows в вашей сборке Python (т. Е. Документы могут быть устаревшими).
В противном случае вы можете использовать библиотеку pywin32 для прямого вызова функции GetDiskFreeSpaceEx.
os.statvfs () не работает в Windows (Python 2.5.2 - текущая производственная версия).
Я не знаю какого-либо кроссплатформенного способа достижения этого, но, возможно, хорошим обходным решением для вас было бы написать класс-оболочку, который проверяет операционную систему и использует лучший метод для каждого.
Для Windows в расширениях win32 есть метод GetDiskFreeSpaceEx.
Вы можете использовать df как кроссплатформенный способ. Это часть Основные утилиты GNU. Это основные служебные программы, которые, как ожидается, будут присутствовать в каждой операционной системе. Однако по умолчанию они не устанавливаются в Windows (здесь пригодится GetGnuWin32).
df - это утилита командной строки, поэтому оболочка необходима для написания сценариев. Например:
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
Я не понимаю, почему люди голосуют против. Например, этот ответ может быть кому-то полезен. В любом случае, это хорошая добавка к другим питоново-питоновым растворам. Если кому-то ответ не нравится, это не повод отрицать его. Насколько я понимаю, голоса против - это совершенно неправильные ответы. Это не так.
@ovgolovin Up проголосуйте за этот ответ, и хорошо бы знать другой способ сделать то же самое.
Если вы не хотите добавлять другую зависимость, вы можете для Windows использовать ctypes для прямого вызова функции 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'
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
Обратите внимание, что вы должен передаете имя каталога, чтобы GetDiskFreeSpaceEx()
работал
(statvfs()
работает как с файлами, так и с каталогами). Вы можете получить имя каталога
из файла с os.path.dirname()
.
Также см. Документацию для os.statvfs()
и GetDiskFreeSpaceEx
.
.f_bfree
- общее количество свободных блоков в файловой системе. Его нужно умножить на .f_bsize
, чтобы получить количество байтов.
По крайней мере, в OS X Lion / Python 2.7 я заметил, что умножение на .f_bsize
дает слишком большое значение, поскольку f_bsize
- это размер блока предпочтительный, а .f_frsize
- размер блока фундаментальный и дает правильное значение. В моей тестовой системе linux оба значения идентичны, поэтому .f_frsize
должен работать постоянно.
Работает, чтобы получить доступный диск на телефоне Android, подключенном через USB к системе Windows, запустив скрипт в Windows. Большой.
@ J.F.Sebastian Это зависит от того, чего вы хотите. Linux может зарезервировать место для root. Если вы хотите включить это пространство, используйте f_bfree. Если вы хотите получить количество блоков, доступных пользователю, используйте f_bavail. Может кто-нибудь скажет, если и как трактуются квоты?
У меня есть три мелочи с указанным выше: 1 / Строка документации неверна, она возвращает пространство в мегабайтах и 2 / Мне никогда не нравится видеть более одного оператора возврата (я думаю, слишком много времени, как тестировщик), поэтому я бы сохранил результат в возвращаемое значение, 3 / целый МБ или десятичный МБ может иметь значение для некоторых людей.
Вы также можете проверить платформу через систему sys.platform == 'win32'
, также доступна под os
! Итак: os.sys.platform == 'win32'
. Снижение до 2-х импортных! ;]
или os.name == 'nt'
!
Хороший кроссплатформенный способ - использовать psutil: http://pythonhosted.org/psutil/#disks (Обратите внимание, что вам понадобится psutil 0.3.0 или выше).
Это был бы лучший ответ, но, к сожалению, psutil нельзя установить через pip.
psutil теперь доступен из pypi и большинства других источников, включая пакеты debian.
Вы можете использовать модуль wmi для Windows и os.statvfs для unix
для окна
import wmi
c = wmi.WMI ()
for d in c.Win32_LogicalDisk():
print( d.Caption, d.FreeSpace, d.Size, d.DriveType)
для unix или linux
from os import statvfs
statvfs(path)
Не могу поверить, как далеко мне пришлось зайти в этот вопрос, чтобы найти кого-то, кто упоминает WMI. Все эти сумасшедшие люди, использующие ctypes для прямого вызова Windows C API, когда они могли просто использовать WMI?
@CraigRinger Да, вы правы. Чтобы поступать правильно, мы должны использовать правильный инструмент. Большинство общих задач управления окном уже заключены в win api в wmi. Колесо переделывать не нужно. : ^ D
Почему psutil
не справится с этим?
Вот почему я люблю stackoverflow. Я даже не знал о модуле WMI, и он работал безупречно.
@ Fr0zenFyr да, это еще один хороший вариант для решения этой задачи.
Что ж, если вы хотите поддерживать oldschool python 2.7 ваниль: вам нужно сделать эти вещи. Чем меньше внешних зависимостей, тем лучше. ctypes
встроен! ?
Установите псутил с помощью pip install psutil
. Затем вы можете получить количество свободного места в байтах, используя:
import psutil
print(psutil.disk_usage(".").free)
Почему это не лучший ответ?
Я думаю, потому что psutil не всегда был доступен через pypi.
Я согласен, это отличный ответ. Я исправил устаревшую ссылку на psutil
. Поскольку disk_usage.free
обычно возвращает огромное целое число 64b, я предлагаю вам также показать людям disk_usage.percent
. psutil.disk_usage(".").percent < 99.9
мне кажется понятнее ...
Ниже код возвращает правильное значение в окнах
import win32file
def get_free_space(dirname):
secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
return secsPerClus * bytesPerSec * nFreeClus
Из Python 3.3 вы можете использовать shutil.disk_usage ("/"). бесплатно из стандартной библиотеки как для Windows, так и для UNIX :)
Использование shutil.disk_usage()
с регуляризацией имен os.path.realpath('/')
работает:
from os import path
from shutil import disk_usage
print([i / 1000000 for i in disk_usage(path.realpath('/'))])
Или же
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)
что дает вам общее, используемое и свободное пространство в МБ.
Смотрите этот рецепт здесь: code.activestate.com/recipes/577972-disk-usage/?in=user-4178 764