una textos open lista leer imprimir guardar gestion funciones formas escribir como archivos archivo python linux filesystems diskspace vfs

textos - guardar una lista en un archivo python



Encuentra el tamaño y el espacio libre del sistema de archivos que contiene un archivo dado (10)

A partir de Python 3.3, hay una forma fácil y directa de hacerlo con la biblioteca estándar:

┌─[james@james-desktop] - [~/temp] - [Fri Sep 30, 01:38] └─[$]> cat free_space.py #!/usr/bin/env python3 import shutil total, used, free = shutil.disk_usage(__file__) print(total, used, free) ┌─[james@james-desktop] - [~/temp] - [Fri Sep 30, 01:38] └─[$]> ./free_space.py 1007870246912 460794834944 495854989312

Estos números están en bytes. Ver la documentación para más información.

Estoy usando Python 2.6 en Linux. ¿Cuál es la manera más rápida?

  • para determinar qué partición contiene un directorio o archivo determinado?

    Por ejemplo, supongamos que /dev/sda2 está montado en /home , y /dev/mapper/foo está montado en /home/foo . Desde la secuencia "/home/foo/bar/baz" me gustaría recuperar el par ("/dev/mapper/foo", "home/foo") .

  • y luego, para obtener estadísticas de uso de la partición dada? Por ejemplo, dado /dev/mapper/foo me gustaría obtener el tamaño de la partición y el espacio libre disponible (en bytes o aproximadamente en megabytes).


Esto debería hacer todo lo que pidas:

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

En mi caja, el código de arriba imprime:

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)


Esto no da el nombre de la partición, pero puede obtener las estadísticas del sistema de archivos directamente usando la statvfs sistema statvfs Unix. Para llamarlo desde Python, use os.statvfs(''/home/foo/bar/baz'') .

Los campos relevantes en el resultado, según 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.

Entonces, para darle sentido a los valores, multiplica por 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)


La forma más sencilla de descubrirlo.

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)


Para el primer punto, puede intentar usar os.path.realpath para obtener una ruta canónica, getmntent contra /etc/mtab (en realidad, sugeriría llamar a getmntent , pero no puedo encontrar una forma normal de acceder a ella) para encontrar el partido más largo. (para estar seguro, probablemente debería stat tanto el archivo como el punto de montaje presunto para verificar que están de hecho en el mismo dispositivo)

Para el segundo punto, use os.statvfs para obtener información sobre el tamaño y el uso del bloque.

(Descargo de responsabilidad: no he probado nada de esto, la mayoría de lo que sé proviene de las fuentes de coreutils)


Para la segunda parte de su pregunta, "obtener estadísticas de uso de la partición dada", psutil hace fácil con la función disk_usage(path) . Dada una ruta, disk_usage() devuelve una tupla nombrada que incluye el espacio total, usado y libre expresado en bytes, más el porcentaje de uso.

Ejemplo simple de la documentación:

>>> import psutil >>> psutil.disk_usage(''/'') sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)

Psutil funciona con versiones de Python de 2.6 a 3.6 y en Linux, Windows y OSX, entre otras plataformas.


Por lo general, el /proc contiene dicha información en Linux, es un sistema de archivos virtual. Por ejemplo, /proc/mounts brinda información sobre los discos montados actualmente; y puedes analizarlo directamente. Las utilidades como top , df hacen uso de /proc .

No lo he usado, pero esto también podría ser útil, si quieres un envoltorio: http://bitbucket.org/chrismiles/psi/wiki/Home


Si solo necesita el espacio libre en un dispositivo, consulte la respuesta usando os.statvfs() continuación.

Si también necesita el nombre del dispositivo y el punto de montaje asociado con el archivo, debe llamar a un programa externo para obtener esta información. df proporcionará toda la información que necesita: cuando se llama como df filename , imprime una línea sobre la partición que contiene el archivo.

Para dar un ejemplo:

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

Tenga en cuenta que esto es bastante frágil, ya que depende del formato exacto de la salida de df , pero no conozco una solución más sólida. (Hay algunas soluciones basadas en el sistema de archivos /proc continuación que son incluso menos portátiles que esta).


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


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

Algunos ejemplos de rutas de acceso en mi computadora:

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

PD

si en Python ≥3.3, hay shutil.disk_usage(path) que devuelve una tupla con nombre de (total, used, free) expresado en bytes.