Determinación del tipo de sistema de archivos a partir de una ruta en Python

¿Hay alguna forma portátil en Python (2. *) para obtener el tipo de sistema de archivos del dispositivo que contiene una ruta determinada? Por ejemplo, algo como:

>>> get_fs_type("/foo/bar") 'vfat' 

Aquí está mi solución. Intenté hacerlo más genérico para los casos en que / var / lib es una partición diferente. Alguna fealdad arrastrada en el código ya que Windows siempre tiene el separador al final del punto de assembly, mientras que esto se omite en Linux. Lo que significa probarlos a ambos.

 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)) 

En las ventanas:

 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:\\') 

En 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') 

Gracias al comentario del usuario 3012759, aquí hay una solución (que se puede mejorar pero que, sin embargo, funciona):

 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 

Se necesitaba un tratamiento separado para “/” en GNU / Linux, ya que todas las rutas (absolutas) comienzan con eso.

Aquí hay un ejemplo del código “en acción” (GNU / Linux):

 >>> get_fs_type("/tmp") 'ext4' >>> get_fs_type("/media/WALKMAN") 'vfat' 

Y otro bajo Windows (XP si importa):

 >>> 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