Pagkuha ng laki ng isang file o direktoryo (folder) sa Python

Negosyo

Gamit ang Python standard library os, maaari mong makuha ang laki (kapasidad) ng isang file o ang kabuuang sukat ng mga file na nakapaloob sa isang direktoryo.

Ang sumusunod na tatlong pamamaraan ay ipinaliwanag. Ang mga yunit ng mga laki na maaaring makuha ay lahat ng byte.

  • Kunin ang laki ng file:os.path.getsize()
  • Kunin ang laki ng isang direktoryo sa pamamagitan ng pagsasama-sama ng mga sumusunod na function (Python 3.5 o mas bago):os.scandir()
  • Pagsamahin ang mga sumusunod na function upang makuha ang laki ng direktoryo (Python 3.4 at mas maaga):os.listdir()

Kunin ang laki ng file:os.path.getsize()

Ang laki (kapasidad) ng file ay maaaring makuha sa os.path.getsize().

Ibigay ang path ng file na ang laki ay gusto mong makuha bilang argumento.

import os

print(os.path.getsize('data/src/lena_square.png'))
# 473831

Kunin ang laki ng isang direktoryo (folder):os.scandir()

Upang kalkulahin ang kabuuang sukat ng mga file na nasa isang direktoryo (folder), gamitin ang os.scandir().

Ang function na ito ay idinagdag sa Python 3.5, kaya ang mga naunang bersyon ay gumagamit ng os.listdir(). os.listdir() halimbawa ay inilarawan sa ibang pagkakataon.

Tukuyin ang isang function bilang mga sumusunod.

def get_dir_size(path='.'):
    total = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total += entry.stat().st_size
            elif entry.is_dir():
                total += get_dir_size(entry.path)
    return total

print(get_dir_size('data/src'))
# 56130856

os.scandir() ay nagbabalik ng isang iterator ng os.DirEntry object.

DirEntry object, gamitin ang is_file() at is_dir() na mga pamamaraan upang matukoy kung ito ay isang file o isang direktoryo. Kung ito ay isang file, ang laki ay nakuha mula sa st_size attribute ng stat_result object. Sa kaso ng isang direktoryo, ang function na ito ay tinatawag na recursively upang idagdag ang lahat ng laki at ibalik ang kabuuang sukat.

Bilang karagdagan, bilang default, ang is_file() ay nagbabalik ng TRUE para sa mga simbolikong link sa mga file. Gayundin, ang is_dir() ay nagbabalik ng true para sa mga simbolikong link sa mga direktoryo. Kung gusto mong balewalain ang mga simbolikong link, itakda ang follow_symlinks argument ng is_file() at is_dir() sa false.

Gayundin, kung hindi mo kailangang daanan ang mga subdirectory, maaari mo lamang tanggalin ang sumusunod na bahagi.

            elif entry.is_dir():
                total += get_dir_size(entry.path)

Ang function sa itaas ay mabibigo kung ang path ng file ay ipinasa bilang isang argumento. Kung kailangan mo ng isang function upang ibalik ang laki ng isang file o isang direktoryo, maaari mong isulat ang sumusunod.

def get_size(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size(path)

print(get_size('data/src'))
# 56130856

print(get_size('data/src/lena_square.png'))
# 473831

Kunin ang laki ng isang direktoryo (folder):os.listdir()

Walang os.scandir() sa Python 3.4 o mas maaga, kaya gumamit ng os.listdir().

Tukuyin ang isang function bilang mga sumusunod.

def get_dir_size_old(path='.'):
    total = 0
    for p in os.listdir(path):
        full_path = os.path.join(path, p)
        if os.path.isfile(full_path):
            total += os.path.getsize(full_path)
        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)
    return total

print(get_dir_size_old('data/src'))
# 56130856

Ang pangunahing ideya ay kapareho ng sa kaso ng os.scandir().

Ang maaaring makuha sa os.listdir() ay isang listahan ng mga pangalan ng file (mga pangalan ng direktoryo). Ang bawat pangalan ng file o pangalan ng direktoryo ay pinagsama sa path ng parent directory na may os.path.join() upang gawin ang buong path.

Kung ang target ay isang simbolikong link, huhusgahan ng os.path.isfile() at os.path.isdir() ang entity. Kaya, kung gusto mong balewalain ang mga simbolikong link, gumamit ng kondisyon na paghatol kasama ng os.path.islink(), na nagbabalik ng totoo para sa mga simbolikong link.

Tulad ng sa kaso ng os.scandir(), kung hindi mo kailangang daanan ang mga subdirectory, tanggalin lamang ang sumusunod na bahagi.

        elif os.path.isdir(full_path):
            total += get_dir_size_old(full_path)

Ang function sa itaas ay mabibigo kung ang path ng file ay ipinasa bilang isang argumento. Kung kailangan mo ng isang function upang ibalik ang laki ng isang file o isang direktoryo, maaari mong isulat ang sumusunod.

def get_size_old(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size_old(path)

print(get_size_old('data/src'))
# 56130856

print(get_size_old('data/src/lena_square.png'))
# 473831