我在Linux上使用Python 2.6。最快的方法是什么:
确定哪个分区包含给定目录或文件?
例如,假设/dev/sda2
上安装了/home
,而/dev/mapper/foo
上安装了/home/foo
。从字符串"/home/foo/bar/baz"
我想恢复对("/dev/mapper/foo", "home/foo")
。
然后,获取给定分区的使用情况统计信息?例如,给定/dev/mapper/foo
我想获得分区的大小和可用的可用空间(以字节或大约以兆字节为单位)。
答案 0 :(得分:108)
这不提供分区的名称,但您可以使用statvfs
Unix系统调用直接获取文件系统统计信息。要从Python调用它,请使用os.statvfs('/home/foo/bar/baz')
。
结果中的相关字段according to POSIX:
unsigned long f_frsize Fundamental file system block size. fsblkcnt_t f_blocks Total number of blocks on file system in units of f_frsize. fsblkcnt_t f_bfree Total number of free blocks. fsblkcnt_t f_bavail Number of free blocks available to non-privileged process.
因此,要理解这些值,请乘以f_frsize
:
import os
statvfs = os.statvfs('/home/foo/bar/baz')
statvfs.f_frsize * statvfs.f_blocks # Size of filesystem in bytes
statvfs.f_frsize * statvfs.f_bfree # Actual number of free bytes
statvfs.f_frsize * statvfs.f_bavail # Number of free bytes that ordinary users
# are allowed to use (excl. reserved space)
答案 1 :(得分:40)
如果您只需要设备上的可用空间,请使用下面的os.statvfs()
查看答案。
如果还需要与文件关联的设备名称和挂载点,则应调用外部程序以获取此信息。 df
将提供您需要的所有信息 - 当调用df filename
时,它会打印一行关于包含该文件的分区。
举个例子:
import subprocess
df = subprocess.Popen(["df", "filename"], stdout=subprocess.PIPE)
output = df.communicate()[0]
device, size, used, available, percent, mountpoint = \
output.split("\n")[1].split()
请注意,这是相当脆弱的,因为它取决于df
输出的确切格式,但我不知道更强大的解决方案。 (有一些解决方案依赖于下面的/proc
文件系统,它们比这个文件系统更不便携。)
答案 2 :(得分:22)
import os
def get_mount_point(pathname):
"Get the mount point of the filesystem containing pathname"
pathname= os.path.normcase(os.path.realpath(pathname))
parent_device= path_device= os.stat(pathname).st_dev
while parent_device == path_device:
mount_point= pathname
pathname= os.path.dirname(pathname)
if pathname == mount_point: break
parent_device= os.stat(pathname).st_dev
return mount_point
def get_mounted_device(pathname):
"Get the device mounted at pathname"
# uses "/proc/mounts"
pathname= os.path.normcase(pathname) # might be unnecessary here
try:
with open("/proc/mounts", "r") as ifp:
for line in ifp:
fields= line.rstrip('\n').split()
# note that line above assumes that
# no mount points contain whitespace
if fields[1] == pathname:
return fields[0]
except EnvironmentError:
pass
return None # explicit
def get_fs_freespace(pathname):
"Get the free space of the filesystem containing pathname"
stat= os.statvfs(pathname)
# use f_bfree for superuser, or f_bavail if filesystem
# has reserved space for superuser
return stat.f_bfree*stat.f_bsize
我的计算机上的一些示例路径名:
path 'trash':
mp /home /dev/sda4
free 6413754368
path 'smov':
mp /mnt/S /dev/sde
free 86761562112
path '/usr/local/lib':
mp / rootfs
free 2184364032
path '/proc/self/cmdline':
mp /proc proc
free 0
如果在Python≥3.3上,那么shutil.disk_usage(path)
会返回一个以字节表示的(total, used, free)
的命名元组。
答案 3 :(得分:14)
从Python 3.3开始,使用标准库有一种简单直接的方法:
$ cat free_space.py
#!/usr/bin/env python3
import shutil
total, used, free = shutil.disk_usage(__file__)
print(total, used, free)
$ ./free_space.py
1007870246912 460794834944 495854989312
这些数字以字节为单位。有关详细信息,请参阅the documentation。
答案 4 :(得分:13)
这应该让你问到的一切:
import os
from collections import namedtuple
disk_ntuple = namedtuple('partition', 'device mountpoint fstype')
usage_ntuple = namedtuple('usage', 'total used free percent')
def disk_partitions(all=False):
"""Return all mountd partitions as a nameduple.
If all == False return phyisical partitions only.
"""
phydevs = []
f = open("/proc/filesystems", "r")
for line in f:
if not line.startswith("nodev"):
phydevs.append(line.strip())
retlist = []
f = open('/etc/mtab', "r")
for line in f:
if not all and line.startswith('none'):
continue
fields = line.split()
device = fields[0]
mountpoint = fields[1]
fstype = fields[2]
if not all and fstype not in phydevs:
continue
if device == 'none':
device = ''
ntuple = disk_ntuple(device, mountpoint, fstype)
retlist.append(ntuple)
return retlist
def disk_usage(path):
"""Return disk usage associated with path."""
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
try:
percent = ret = (float(used) / total) * 100
except ZeroDivisionError:
percent = 0
# NB: the percentage is -5% than what shown by df due to
# reserved blocks that we are currently not considering:
# http://goo.gl/sWGbH
return usage_ntuple(total, used, free, round(percent, 1))
if __name__ == '__main__':
for part in disk_partitions():
print part
print " %s\n" % str(disk_usage(part.mountpoint))
在我的方框中,上面的代码打印出来:
giampaolo@ubuntu:~/dev$ python foo.py
partition(device='/dev/sda3', mountpoint='/', fstype='ext4')
usage(total=21378641920, used=4886749184, free=15405903872, percent=22.9)
partition(device='/dev/sda7', mountpoint='/home', fstype='ext4')
usage(total=30227386368, used=12137168896, free=16554737664, percent=40.2)
partition(device='/dev/sdb1', mountpoint='/media/1CA0-065B', fstype='vfat')
usage(total=7952400384, used=32768, free=7952367616, percent=0.0)
partition(device='/dev/sr0', mountpoint='/media/WB2PFRE_IT', fstype='iso9660')
usage(total=695730176, used=695730176, free=0, percent=100.0)
partition(device='/dev/sda6', mountpoint='/media/Dati', fstype='fuseblk')
usage(total=914217758720, used=614345637888, free=299872120832, percent=67.2)
答案 5 :(得分:8)
找出它的最简单方法。
import os
from collections import namedtuple
DiskUsage = namedtuple('DiskUsage', 'total used free')
def disk_usage(path):
"""Return disk usage statistics about the given path.
Will return the namedtuple 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 DiskUsage(total, used, free)
答案 6 :(得分:6)
对于第一点,您可以尝试使用os.path.realpath
获取规范路径,针对/etc/mtab
进行检查(我实际上建议调用getmntent
,但我找不到一种正常的访问方式)找到最长的匹配。 (当然,您应该stat
文件和假定的挂载点来验证它们实际上是在同一设备上。
对于第二点,使用os.statvfs
获取块大小和使用信息。
(免责声明:我没有测试过这一点,我所知道的大部分来自coreutils来源)
答案 7 :(得分:3)
import os
def disk_stat(path):
disk = os.statvfs(path)
percent = (disk.f_blocks - disk.f_bfree) * 100 / (disk.f_blocks -disk.f_bfree + disk.f_bavail) + 1
return percent
print disk_stat('/')
print disk_stat('/data')
答案 8 :(得分:3)
对于问题的第二部分,"获取给定分区的使用情况统计信息",psutil可以使用disk_usage(path)功能轻松实现。给定一个路径,disk_usage()
返回一个命名元组,包括以字节为单位的总空间,已用空间和可用空间,以及使用百分比。
文档中的简单示例:
>>> import psutil
>>> psutil.disk_usage('/')
sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
Psutil适用于2.6到3.6的Python版本以及Linux,Windows和OSX以及其他平台。
答案 9 :(得分:1)
通常/proc
目录在Linux中包含此类信息,它是一个虚拟文件系统。例如,/proc/mounts
提供有关当前安装的磁盘的信息;你可以直接解析它。 top
,df
等实用程序都使用/proc
。
我没有使用它,但是如果你想要一个包装器,这也可能会有所帮助:http://bitbucket.org/chrismiles/psi/wiki/Home
答案 10 :(得分:0)
可以按以下步骤检查Windows PC上的磁盘使用情况:
import psutil
fan = psutil.disk_usage(path="C:/")
print("Available: ", fan.total/1000000000)
print("Used: ", fan.used/1000000000)
print("Free: ", fan.free/1000000000)
print("Percentage Used: ", fan.percent, "%")