>>> get_fs_type("/foo/bar")
'vfat'
import psutil, os
def printparts():
for part in psutil.disk_partitions():
print part
def get_fs_type(path):
partition = {}
for part in psutil.disk_partitions():
partition[part.mountpoint] = (part.fstype, part.device)
if path in partition:
return partition[path]
splitpath = path.split(os.sep)
for i in xrange(len(splitpath),0,-1):
path = os.sep.join(splitpath[:i]) + os.sep
if path in partition:
return partition[path]
path = os.sep.join(splitpath[:i])
if path in partition:
return partition[path]
return ("unkown","none")
printparts()
for test in ["/", "/home", "/var", "/var/lib", "C:\\", "C:\\User", "D:\\"]:
print "%s\t%s" %(test, get_fs_type(test))
在 Windows 上:
python test.py
sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed')
sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed')
sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed')
sdiskpart(device='F:\\', mountpoint='F:\\', fstype='', opts='cdrom')
sdiskpart(device='G:\\', mountpoint='G:\\', fstype='', opts='cdrom')
/ ('unkown', 'none')
/home ('unkown', 'none')
/var ('unkown', 'none')
/var/lib ('unkown', 'none')
C:\ ('NTFS', 'C:\\')
C:\User ('NTFS', 'C:\\')
D:\ ('NTFS', 'D:\\')
在 Linux 上:
python test.py
partition(device='/dev/cciss/c0d0p1', mountpoint='/', fstype='ext4', opts='rw,errors=remount-ro')
partition(device='/dev/cciss/c0d1p3', mountpoint='/home', fstype='ext4', opts='rw')
partition(device='/dev/cciss/c0d1p2', mountpoint='/var', fstype='ext4', opts='rw')
/ ('ext4', '/dev/cciss/c0d0p1')
/home ('ext4', '/dev/cciss/c0d1p3')
/var ('ext4', '/dev/cciss/c0d1p2')
/var/lib ('ext4', '/dev/cciss/c0d1p2')
C:\ ('unkown', 'none')
C:\User ('unkown', 'none')
D:\ ('unkown', 'none')
感谢 user3012759 的评论,这里有一个解决方案(当然可以改进,但仍然有效):
import psutil
def get_fs_type(mypath):
root_type = ""
for part in psutil.disk_partitions():
if part.mountpoint == '/':
root_type = part.fstype
continue
if mypath.startswith(part.mountpoint):
return part.fstype
return root_type
GNU/Linux 下需要单独处理“/”,因为所有(绝对)路径都以此开头。
这是“实际运行”的代码示例(GNU/Linux):
>>> get_fs_type("/tmp")
'ext4'
>>> get_fs_type("/media/WALKMAN")
'vfat'
还有 Windows 下的另一个(如果有的话 XP):
>>> get_fs_type("C:\\") # careful: "C:" will yield ''
'NTFS'
import psutil
def get_fs_type(path):
bestMatch = ""
fsType = ""
for part in psutil.disk_partitions():
if mypath.startswith(part.mountpoint) and len(bestMatch) < len(part.mountpoint):
fsType = part.fstype
bestMatch = part.mountpoint
return fsType
P = subprocess.run(['stat', '-f', '-c', '%T', path],
capture_output=True)
fstype = P.stdout.strip().lower()
对于任何优先考虑简洁性的人,这里有一个稍微简短的 gena2x 答案版本:def get_fs_type(path):
path_matching_fstypes_mountpoints = [
part for part in disk_partitions()
if str(path.resolve()).startswith(part.mountpoint)
]
return sorted(path_matching_fstypes_mountpoints, key=lambda x: len(x.mountpoint))[-1].fstype