Python тілінде файлдың немесе каталогтың (қалтаның) өлшемін алу

Іскерлік

Python стандартты кітапханалық операциялық жүйесін пайдалану арқылы сіз файлдың өлшемін (сыйымдылығын) немесе каталогтағы файлдардың жалпы өлшемін ала аласыз.

Келесі үш әдіс түсіндіріледі. Алынатын өлшем бірліктері барлық байт болып табылады.

  • Файл өлшемін алыңыз:os.path.getsize()
  • Келесі функцияларды біріктіру арқылы каталог өлшемін алыңыз (Python 3.5 немесе одан кейінгі нұсқасы):os.scandir()
  • Каталогтың өлшемін алу үшін келесі функцияларды біріктіріңіз (Python 3.4 және одан бұрынғы):os.listdir()

Файл өлшемін алыңыз:os.path.getsize()

Файлдың өлшемін (сыйымдылығын) os.path.getsize() арқылы алуға болады.

Аргумент ретінде өлшемін алғыңыз келетін файлдың жолын көрсетіңіз.

import os

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

Каталогтың (қалтаның) өлшемін алу:os.scandir()

Каталогтағы (қалтадағы) файлдардың жалпы өлшемін есептеу үшін os.scandir() пайдаланыңыз.

Бұл функция Python 3.5 жүйесінде қосылған, сондықтан бұрынғы нұсқалар os.listdir() пайдаланады. os.listdir() мысалы кейінірек сипатталған.

Функцияны келесідей анықтаңыз.

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() os.DirEntry нысанының итераторын қайтарады.

DirEntry нысанында оның файл немесе каталог екенін анықтау үшін is_file() және is_dir() әдістерін пайдаланыңыз. Егер бұл файл болса, өлшем stat_result нысанының st_size атрибутынан алынады. Каталог жағдайында бұл функция барлық өлшемдерді қосу және жалпы өлшемді қайтару үшін рекурсивті түрде шақырылады.

Бұған қоса, әдепкі бойынша is_file() файлдарға символдық сілтемелер үшін TRUE мәнін қайтарады. Сондай-ақ, is_dir() каталогтарға символдық сілтемелер үшін true мәнін қайтарады. Символдық сілтемелерді елемеу керек болса, is_file() және is_dir() мәндерінің follow_symlinks аргументін false мәніне орнатыңыз.

Сондай-ақ, ішкі каталогтарды айналып өту қажет болмаса, келесі бөлікті жоюға болады.

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

Файл жолы аргумент ретінде берілсе, жоғарыдағы функция орындалмайды. Егер сізге файлдың немесе каталогтың өлшемін қайтару функциясы қажет болса, келесіні жазуға болады.

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

Каталогтың (қалтаның) өлшемін алу:os.listdir()

Python 3.4 немесе одан бұрынғы нұсқаларында os.scandir() жоқ, сондықтан os.listdir() пайдаланыңыз.

Функцияны келесідей анықтаңыз.

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

Негізгі идея os.scandir() жағдайындағы сияқты.

os.listdir() арқылы алуға болатын нәрсе файл атауларының тізімі (каталог атаулары). Әрбір файл атауы немесе каталог атауы толық жолды жасау үшін os.path.join() арқылы негізгі каталогтың жолымен біріктіріледі.

Егер мақсат символдық сілтеме болса, os.path.isfile() және os.path.isdir() нысанды бағалайды. Сондықтан, символдық сілтемелерді елемеу керек болса, шартты пайымдауды символдық сілтемелер үшін ақиқат мәнін қайтаратын os.path.islink() параметрімен бірге пайдаланыңыз.

os.scandir() жағдайындағыдай, ішкі каталогтарды айналып өтудің қажеті болмаса, келесі бөлікті жойыңыз.

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

Файл жолы аргумент ретінде берілсе, жоғарыдағы функция орындалмайды. Егер сізге файлдың немесе каталогтың өлшемін қайтару функциясы қажет болса, келесіні жазуға болады.

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