Dobivanje veličine datoteke ili direktorija (mape) u Pythonu

Poslovanje

Koristeći OS standardne biblioteke Python, možete dobiti veličinu (kapacitet) datoteke ili ukupnu veličinu datoteka sadržanih u direktoriju.

Objašnjene su sljedeće tri metode. Jedinice veličina koje se mogu dobiti su svi bajtovi.

  • Dobijte veličinu datoteke:os.path.getsize()
  • Dobijte veličinu direktorija kombiniranjem sljedećih funkcija (Python 3.5 ili noviji):os.scandir()
  • Kombinirajte sljedeće funkcije da biste dobili veličinu direktorija (Python 3.4 i stariji):os.listdir()

Dobijte veličinu datoteke:os.path.getsize()

Veličina (kapacitet) datoteke može se dobiti pomoću os.path.getsize().

Navedite stazu datoteke čiju veličinu želite dobiti kao argument.

import os

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

Dobijte veličinu direktorija (mape):os.scandir()

Za izračunavanje ukupne veličine datoteka sadržanih u direktoriju (mapi), koristite os.scandir().

Ova je funkcija dodana u Python 3.5, tako da starije verzije koriste os.listdir(). Primjer os.listdir() opisan je kasnije.

Definirajte funkciju na sljedeći način.

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() vraća iterator os.DirEntry objekta.

Objekt DirEntry, koristite metode is_file() i is_dir() da odredite je li to datoteka ili direktorij. Ako se radi o datoteci, veličina se dobiva iz atributa st_size objekta stat_result. U slučaju imenika, ova funkcija se poziva rekurzivno da zbroji sve veličine i vrati ukupnu veličinu.

Osim toga, prema zadanim postavkama, is_file() vraća TRUE za simboličke veze na datoteke. Također, is_dir() vraća true za simboličke veze na direktorije. Ako želite zanemariti simboličke veze, postavite argument follow_symlinks za is_file() i is_dir() na false.

Također, ako ne trebate prolaziti kroz poddirektorijume, možete jednostavno izbrisati sljedeći dio.

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

Gornja funkcija neće uspjeti ako se put datoteke prenese kao argument. Ako vam je potrebna funkcija za vraćanje veličine datoteke ili direktorija, možete napisati sljedeće.

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

Dobijte veličinu direktorija (mape):os.listdir()

Ne postoji os.scandir() u Pythonu 3.4 ili ranijem, stoga koristite os.listdir().

Definirajte funkciju na sljedeći način.

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

Osnovna ideja je ista kao u slučaju os.scandir().

Ono što se može dobiti pomoću os.listdir() je popis naziva datoteka (imena direktorija). Svaki naziv datoteke ili ime direktorija spaja se s stazom roditeljskog direktorija pomoću os.path.join() kako bi se stvorio puni put.

Ako je cilj simbolička veza, os.path.isfile() i os.path.isdir() će suditi o entitetu. Dakle, ako želite zanemariti simboličke veze, upotrijebite uvjetnu prosudbu u kombinaciji s os.path.islink(), koja vraća true za simboličke veze.

Kao iu slučaju os.scandir(), ako ne trebate prelaziti poddirektorije, samo izbrišite sljedeći dio.

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

Gornja funkcija neće uspjeti ako se put datoteke prenese kao argument. Ako vam je potrebna funkcija za vraćanje veličine datoteke ili direktorija, možete napisati sljedeće.

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