복붙노트

[PYTHON] 주어진 파일을 포함하는 파일 시스템의 크기와 여유 공간을 찾습니다.

PYTHON

주어진 파일을 포함하는 파일 시스템의 크기와 여유 공간을 찾습니다.

Linux에서 Python 2.6을 사용하고 있습니다. 가장 빠른 방법은 무엇입니까?

해결법

  1. ==============================

    1.장치에 여유 공간이 필요하면 아래 os.statvfs ()를 사용하여 대답을 참조하십시오.

    장치에 여유 공간이 필요하면 아래 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. ==============================

    2.이것은 파티션의 이름을 알려주지는 않지만 statvfs Unix 시스템 호출을 사용하여 직접 파일 시스템 통계를 얻을 수 있습니다. 파이썬에서 호출하려면 os.statvfs ( '/ home / foo / bar / baz')를 사용하십시오.

    이것은 파티션의 이름을 알려주지는 않지만 statvfs Unix 시스템 호출을 사용하여 직접 파일 시스템 통계를 얻을 수 있습니다. 파이썬에서 호출하려면 os.statvfs ( '/ home / foo / bar / baz')를 사용하십시오.

    결과의 관련 필드는 POSIX에 따라 다음과 같습니다.

    따라서 값을 이해하려면 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)
    
  3. ==============================

    3.

    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
    

    파이썬 ≥3.3에 있다면, 바이트로 표현 된 (터무니없는, 사용 된, 자유로운) 터플의 이름을 반환하는 shutil.disk_usage (path)가있다.

  4. ==============================

    4.이것은 당신이 물어 본 모든 것을 만들어야합니다.

    이것은 당신이 물어 본 모든 것을 만들어야합니다.

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

    5.파이썬 3.3부터는 표준 라이브러리로 이것을 쉽고 직접적으로 할 수 있습니다 :

    파이썬 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
    

    이 숫자는 바이트 단위입니다. 자세한 내용은 설명서를 참조하십시오.

  6. ==============================

    6.그것을 발견하는 가장 간단한 방법.

    그것을 발견하는 가장 간단한 방법.

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

    7.첫 번째 요점은 os.path.realpath를 사용하여 정식 경로를 얻고 / etc / mtab에 대해 확인해 볼 수 있습니다 (실제로 getmntent를 호출하는 것이 좋지만 액세스 할 수있는 일반적인 방법은 없습니다). 가장 긴 일치를 찾으십시오. (실제로 파일과 추정 된 마운트 지점을 모두 확인하여 실제로 동일한 장치에 있는지 확인해야합니다)

    첫 번째 요점은 os.path.realpath를 사용하여 정식 경로를 얻고 / etc / mtab에 대해 확인해 볼 수 있습니다 (실제로 getmntent를 호출하는 것이 좋지만 액세스 할 수있는 일반적인 방법은 없습니다). 가장 긴 일치를 찾으십시오. (실제로 파일과 추정 된 마운트 지점을 모두 확인하여 실제로 동일한 장치에 있는지 확인해야합니다)

    두 번째 사항은 os.statvfs를 사용하여 블록 크기 및 사용 정보를 얻는 것입니다.

    (면책 조항 : 나는 이것 중 아무 것도 테스트하지 않았으며, 내가 아는 대부분은 coreutils 소스에서 나온 것임)

  8. ==============================

    8.

    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')
    
  9. ==============================

    9.질문의 두 번째 부분 인 "주어진 파티션의 사용 통계보기"에서 psutil은 disk_usage (path) 함수를 사용하여이 작업을 쉽게 처리합니다. path가 주어지면 disk_usage ()는 합계, 사용 된 공간 및 바이트로 표시된 여유 공간과 사용률을 포함하는 명명 된 튜플을 반환합니다.

    질문의 두 번째 부분 인 "주어진 파티션의 사용 통계보기"에서 psutil은 disk_usage (path) 함수를 사용하여이 작업을 쉽게 처리합니다. 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에서 작동합니다.

  10. ==============================

    10.일반적으로 / proc 디렉토리는 리눅스에서 이러한 정보를 포함하고 있으며 가상 파일 시스템입니다. 예를 들어 / proc / mounts는 현재 마운트 된 디스크에 대한 정보를 제공합니다. 당신은 그것을 직접 파싱 할 수 있습니다. top, df와 같은 유틸리티는 모두 / proc를 사용합니다.

    일반적으로 / proc 디렉토리는 리눅스에서 이러한 정보를 포함하고 있으며 가상 파일 시스템입니다. 예를 들어 / proc / mounts는 현재 마운트 된 디스크에 대한 정보를 제공합니다. 당신은 그것을 직접 파싱 할 수 있습니다. top, df와 같은 유틸리티는 모두 / proc를 사용합니다.

    나는 이것을 사용하지 않았지만 래퍼를 원한다면 이것은 도움이 될 것이다. http://bitbucket.org/chrismiles/psi/wiki/Home

  11. from https://stackoverflow.com/questions/4260116/find-size-and-free-space-of-the-filesystem-containing-a-given-file by cc-by-sa and MIT license