【问题标题】:Get hard disk size in Python在 Python 中获取硬盘大小
【发布时间】:2018-08-02 10:18:48
【问题描述】:

我正在尝试使用 Python 获取硬盘大小和可用空间(我在 macOS 上使用 Python 2.7)。

我正在尝试使用os.statvfs('/'),尤其是使用以下代码。 我在做什么正确吗?我应该使用变量giga 的哪个定义?

import os

def get_machine_storage():
    result=os.statvfs('/')
    block_size=result.f_frsize
    total_blocks=result.f_blocks
    free_blocks=result.f_bfree
    # giga=1024*1024*1024
    giga=1000*1000*1000
    total_size=total_blocks*block_size/giga
    free_size=free_blocks*block_size/giga
    print('total_size = %s' % total_size)
    print('free_size = %s' % free_size)

get_machine_storage()

编辑: statvfs 在 Python 3 中已被弃用,你知道有什么替代方案吗?

【问题讨论】:

  • 您可以查看here 以了解如何解释输出。
  • @VasilisG。谢谢。我看到该方法在 Python 3 中已被弃用,替代方案?
  • 尝试使用来自shutil模块的disk_usage
  • 另一个可能对你有用的问题:stackoverflow.com/questions/4260116/…

标签: python macos python-2.7 hard-drive


【解决方案1】:

对于 Python 2 到 Python 3.3


注意:正如评论部分的一些人所提到的,此解决方案适用于 Python 3.3 及更高版本。对于Python 2.7,最好使用psutil 库,它有一个disk_usage 函数,包含关于totalused可用磁盘空间:

import psutil

hdd = psutil.disk_usage('/')

print ("Total: %d GiB" % hdd.total / (2**30))
print ("Used: %d GiB" % hdd.used / (2**30))
print ("Free: %d GiB" % hdd.free / (2**30))

Python 3.3 及以上版本:

对于 Python 3.3 及更高版本,您可以使用 shutil 模块,该模块具有 disk_usage 函数,返回一个命名元组,其中包含硬盘中的总空间、已用空间和可用空间。

您可以调用以下函数并获取有关磁盘空间的所有信息:

import shutil

total, used, free = shutil.disk_usage("/")

print("Total: %d GiB" % (total // (2**30)))
print("Used: %d GiB" % (used // (2**30)))
print("Free: %d GiB" % (free // (2**30)))

输出:

Total: 931 GiB
Used: 29 GiB
Free: 902 GiB

【讨论】:

  • 很好的答案,但仅以千兆字节为单位计算,totalusedfree 的大小可以是任何值。如果你愿意,你可以使用hurry.filesize 自动处理这个:)
  • @Wondercricket 确实,每次需要不同的单位时都必须修改除数。谢谢推荐:)
  • 仅从 python 3.3 开始
  • 这给你一个分区的大小,而不是整个磁盘。
  • 虽然解决方案可能适用于某些人,但不适用于 python 3.3 以下的任何内容。
【解决方案2】:

https://pypi.python.org/pypi/psutil

import psutil

obj_Disk = psutil.disk_usage('/')

print (obj_Disk.total / (1024.0 ** 3))
print (obj_Disk.used / (1024.0 ** 3))
print (obj_Disk.free / (1024.0 ** 3))
print (obj_Disk.percent)

【讨论】:

  • 让我建议float(1<<30) 而不是(1024.0 ** 3)
【解决方案3】:

代码基本正确,但您使用了错误的字段,这可能会在不同的系统上为您提供错误的结果。正确的做法是:

>>> os.system('df -k /')
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root       14846608 3247272  10945876  23% /

>>> disk = os.statvfs('/')
>>> (disk.f_bavail * disk.f_frsize) / 1024
10945876L

【讨论】:

    【解决方案4】:

    当您不知道如何处理函数的结果时,打印出类型会有所帮助。

    print type(os.statvfs('/')) 返回<type 'posix.statvfs_result'>

    这意味着它不是像字符串或 int 那样的内置类实例。

    您可以使用 dir(instance) 检查您可以对该实例执行哪些操作

    print dir(os.statvfs('/')) 打印所有属性、函数、变量...

    ['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
    '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
    '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__',
    '__lt__', '__mul__', '__ne__', '__new__', '__reduce__',
    '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__',
    '__str__', '__subclasshook__', 'f_bavail', 'f_bfree', 'f_blocks',
    'f_bsize', 'f_favail', 'f_ffree', 'f_files', 'f_flag', 'f_frsize',
    'f_namemax', 'n_fields', 'n_sequence_fields', 'n_unnamed_fields']
    

    通过访问其中一个变量,例如os.statvfs('/').f_ffree,您可以提取一个整数。

    print type(os.statvfs('/').f_ffree) 进行双重检查, 它确实打印了<type 'int'>

    【讨论】:

    • f_ffree 是一些空闲文件描述符或类似的东西,与驱动器上的空闲空间无关
    【解决方案5】:

    根据此处的答案以 GiB 显示磁盘大小的单行解决方案:

    >>> import shutil
    
    >>> [f"{y}: {x//(2**30)} GiB" for x, y in zip(shutil.disk_usage('/'), shutil.disk_usage('/')._fields)]
    ['total: 228 GiB', 'used: 14 GiB', 'free: 35 GiB']
    

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2013-06-15
      • 1970-01-01
      • 2012-05-12
      • 2013-09-28
      • 2013-07-06
      相关资源
      最近更新 更多