Mendapatkan saiz fail atau direktori (folder) dalam Python

Perniagaan

Menggunakan os perpustakaan standard Python, anda boleh mendapatkan saiz (kapasiti) fail atau jumlah saiz fail yang terkandung dalam direktori.

Tiga kaedah berikut diterangkan. Unit saiz yang boleh diperolehi adalah semua bait.

  • Dapatkan saiz fail:os.path.getsize()
  • Dapatkan saiz direktori dengan menggabungkan fungsi berikut (Python 3.5 atau lebih baru):os.scandir()
  • Gabungkan fungsi berikut untuk mendapatkan saiz direktori (Python 3.4 dan lebih awal):os.listdir()

Dapatkan saiz fail:os.path.getsize()

Saiz (kapasiti) fail boleh diperolehi dengan os.path.getsize().

Berikan laluan fail yang saiznya anda ingin dapatkan sebagai hujah.

import os

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

Dapatkan saiz direktori (folder):os.scandir()

Untuk mengira jumlah saiz fail yang terkandung dalam direktori (folder), gunakan os.scandir().

Fungsi ini telah ditambah dalam Python 3.5, jadi versi terdahulu menggunakan os.listdir(). os.listdir() contoh diterangkan kemudian.

Tentukan fungsi seperti berikut.

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() mengembalikan iterator objek os.DirEntry.

Objek DirEntry, gunakan kaedah is_file() dan is_dir() untuk menentukan sama ada ia fail atau direktori. Jika ia adalah fail, saiz diperoleh daripada atribut st_size objek stat_result. Dalam kes direktori, fungsi ini dipanggil secara rekursif untuk menambah semua saiz dan mengembalikan jumlah saiz.

Di samping itu, secara lalai, is_file() mengembalikan TRUE untuk pautan simbolik ke fail. Juga, is_dir() mengembalikan benar untuk pautan simbolik ke direktori. Jika anda ingin mengabaikan pautan simbolik, tetapkan hujah follow_symlinks is_file() dan is_dir() kepada false.

Selain itu, jika anda tidak perlu melintasi subdirektori, anda hanya boleh memadam bahagian berikut.

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

Fungsi di atas akan gagal jika laluan fail diluluskan sebagai hujah. Jika anda memerlukan fungsi untuk mengembalikan saiz fail atau direktori, anda boleh menulis perkara berikut.

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

Dapatkan saiz direktori (folder):os.listdir()

Tiada os.scandir() dalam Python 3.4 atau lebih awal, jadi gunakan os.listdir().

Tentukan fungsi seperti berikut.

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

Idea asas adalah sama seperti dalam kes os.scandir().

Apa yang boleh diperolehi dengan os.listdir() ialah senarai nama fail (nama direktori). Setiap nama fail atau nama direktori digabungkan dengan laluan direktori induk dengan os.path.join() untuk mencipta laluan penuh.

Jika sasaran ialah pautan simbolik, os.path.isfile() dan os.path.isdir() akan menilai entiti tersebut. Jadi, jika anda ingin mengabaikan pautan simbolik, gunakan pertimbangan bersyarat dalam kombinasi dengan os.path.islink(), yang mengembalikan benar untuk pautan simbolik.

Seperti dalam kes os.scandir(), jika anda tidak perlu melintasi subdirektori, hanya padamkan bahagian berikut.

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

Fungsi di atas akan gagal jika laluan fail diluluskan sebagai hujah. Jika anda memerlukan fungsi untuk mengembalikan saiz fail atau direktori, anda boleh menulis perkara berikut.

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