Obținerea dimensiunii unui fișier sau director (folder) în Python

Afaceri

Utilizând biblioteca standard Python os, puteți obține dimensiunea (capacitatea) unui fișier sau dimensiunea totală a fișierelor conținute într-un director.

Sunt explicate următoarele trei metode. Unitățile de măsură care pot fi obținute sunt toți octeții.

  • Obțineți dimensiunea fișierului:os.path.getsize()
  • Obțineți dimensiunea unui director prin combinarea următoarelor funcții (Python 3.5 sau o versiune ulterioară):os.scandir()
  • Combinați următoarele funcții pentru a obține dimensiunea directorului (Python 3.4 și versiunile anterioare):os.listdir()

Obțineți dimensiunea fișierului: os.path.getsize()

Dimensiunea (capacitatea) fișierului poate fi obținută cu os.path.getsize().

Indicați ca argument calea fișierului a cărui dimensiune doriți să o obțineți.

import os

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

Obțineți dimensiunea unui director (folder): os.scandir()

Pentru a calcula dimensiunea totală a fișierelor conținute într-un director (folder), utilizați os.scandir().

Această funcție a fost adăugată în Python 3.5, astfel încât versiunile anterioare utilizează os.listdir(). Exemplul os.listdir() este descris mai târziu.

Se definește o funcție după cum urmează.

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() returnează un iterator al obiectului os.DirEntry.

DirEntry, utilizați metodele is_file() și is_dir() pentru a determina dacă este un fișier sau un director. În cazul în care este un fișier, dimensiunea este obținută din atributul st_size al obiectului stat_result. În cazul unui director, această funcție este apelată în mod recursiv pentru a aduna toate dimensiunile și a returna dimensiunea totală.

În plus, în mod implicit, is_file() returnează TRUE pentru legăturile simbolice către fișiere. De asemenea, is_dir() returnează true pentru legăturile simbolice către directoare. Dacă doriți să ignorați legăturile simbolice, setați argumentul follow_symlinks din is_file() și is_dir() la false.

De asemenea, dacă nu aveți nevoie să parcurgeți subdirectoarele, puteți șterge doar următoarea parte.

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

Funcția de mai sus va eșua dacă calea fișierului este trecută ca argument. Dacă aveți nevoie de o funcție care să returneze dimensiunea unui fișier sau a unui director, puteți scrie următoarele.

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

Obțineți dimensiunea unui director (folder): os.listdir()

Nu există os.scandir() în Python 3.4 sau mai devreme, așa că utilizați os.listdir().

Se definește o funcție după cum urmează.

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

Ideea de bază este aceeași ca și în cazul os.scandir().

Ceea ce se poate obține cu os.listdir() este o listă de nume de fișiere (nume de directoare). Fiecare nume de fișier sau nume de director este unit cu calea directorului părinte cu os.path.join() pentru a crea calea completă.

În cazul în care ținta este o legătură simbolică, os.path.isfile() și os.path.isdir() vor judeca entitatea. Prin urmare, dacă doriți să ignorați legăturile simbolice, utilizați judecata condiționată în combinație cu os.path.islink(), care returnează true pentru legăturile simbolice.

Ca și în cazul os.scandir(), dacă nu aveți nevoie să parcurgeți subdirectoarele, ștergeți doar partea următoare.

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

Funcția de mai sus va eșua dacă calea fișierului este trecută ca argument. Dacă aveți nevoie de o funcție care să returneze dimensiunea unui fișier sau a unui director, puteți scrie următoarele.

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
Copied title and URL