Как да проверя размера на файла и папката в Python?

В тази статия ще научите как да проверявате размера на файл или папка в Python

Python е един от най-универсалните езици за програмиране. С него ще можете да изграждате от малка CLI (интерфейс на командния ред) програма до сложно уеб приложение.

Една от най-недооценените му характеристики обаче е възможността за взаимодействие с оперативни системи. Управлението на операции на ОС с Python може да ви спести много време, когато създавате процеси за автоматизация.

Нека да видим как Python взаимодейства с операционната система.

Как Python взаимодейства с операционната система?

Никой не може да живее изолиран от средата си. Това важи и за Python, където понякога е основно да се взаимодейства с оперативната система, за да се свършат нещата.

Python има няколко модула, които ни позволяват да взаимодействаме с операционната система. Най-използваните са os, sys, pathlib и subprocess.

Тъй като те са вградени модули, няма да е необходимо да ги инсталирате с PIP. Можете да импортирате всички от тях със следния оператор:

import os
import sys
import pathlib
import subprocess

Списъкът по-долу показва основната функционалност на всеки един от тези импортирания:

  • OS: Преносим начин за използване на специфична за системата (в зависимост от вашата операционна система) функционалност. Това е правилният избор в повечето случаи, освен ако не се нуждаете от нещо по-модерно
  • Sys: Специфични за системата параметри и функции. Този модул осигурява достъп до променливи и функции на интерпретатора. Модулът os взаимодейства с операционната система, а sys взаимодейства с интерпретатора на Python
  • Pathlib: Разширено използване на пътя. Позволява ви да представяте файлови системи като обекти, със съответната семантика за всяка ОС.
  • Подпроцес: Изпълнение и управление на подпроцеси директно от Python. Това включва работа с stdin, stdout и кодове за връщане. Можете да научите повече за това, като прочетете нашето ръководство за подпроцеси на Python.

Има библиотеки от високо ниво, които включват още по-специфична функционалност в зависимост от вашите нужди. През повечето време обаче е добре да използвате горните модули.

Забележка: Повечето от функциите, предоставени от тези модули, ще имат различен изход в зависимост от вашата операционна система. Не забравяйте, че обикновено най-добрият мач е UNIX и Python.

  Как да преинсталирате Microsoft Visual C++ Redistributable

След като схванахте бързо как Python взаимодейства с операционната система, нека преминем към методите за проверка на размера на файла и папката. Всички следните решения са налични в Размер на файла и папката в Python GitHub хранилище

Използвайки os.stat().st_size

В този метод ще използваме статистика() функция от модула os. Връща много информация за конкретен път.

Забележка: Функцията os.path.getsize() също свършва работата. Предимството на използването на os.stat().st_size е, че не следва симлинкове.

Преди да продължим, нека създадем тестов файл с име lorem.txt, в който ще поставим малко тъп текст. Можем да посетим a Текстов генератор Lorem Ipsum и поставете текста във файла lorem.txt.

В същата директория създайте файл с име method1.py и поставете кода по-долу:

import os
size = os.stat('lorem.txt').st_size
print(size)

Нека разбием какво правим с този код:

  • В първия ред импортираме os модула
  • Променливата size съдържа размера на файла lorem.txt
    • Функцията os.stat() връща куп информация, свързана с файла
    • Атрибутът st_size представлява размера на файла
  • Отпечатваме променливата за размера

Опитайте да стартирате скрипта на Python. Ще получите различен резултат в зависимост от съдържанието на вашия файл lorem.txt.

Изход:

20064

Изходът е представен в байтове. Това изобщо не се чете, така че нека го хуманизираме, за да можем да имаме по-добра представа за размера на файла.

Първо инсталирайте хуманизирам пакет, като изпълните следната команда във вашата обвивка:

pip install humanize

След това можете да използвате функцията naturalsize(), която преобразува стойност в байтове в четим размер на файла, например KB, MB, GB или TB.

import os
from humanize import naturalsize

size = os.stat('lorem.txt').st_size

print(size)
print(naturalsize(size))

Първоначално кодът по-горе отпечатва размера на файла в байтове, след което отпечатва резултата в четим размер.

Изход:

20064
20.1 kB

Използване на Pathlib

Макар че pathlib е проектиран да работи изключително с пътеки, той включва някои полезни функции от други модули като методи на обекти Path (Екземпляри на класа Path).

Създайте файл method2.py и импортирайте Клас път.

from pathlib import Path

След това създайте обект Path, предавайки пътя към файла lorem.txt като аргумент.

file_ = Path('lorem.txt')

Сега можете да получите достъп до метода stat() на класа Path. Работи по същия начин като функцията os.stat(), следователно ще можете да отпечатате размера на файла.

print(file_.stat().st_size)

Изход:

20064

Както можете да видите, получихме същия резултат като при първия метод, който използвахме. Резултатът по-горе също се отпечатва в байтов формат, така че можем да използваме модула за хуманизиране, за да го направим четим.

from pathlib import Path
from humanize import naturalsize

size = Path('lorem.txt').stat().st_size

print(naturalsize(size))

Този код произвежда следния изход:

20.1 kB

Използване на Unix команди с подпроцес:

Модулът за подпроцес ни позволява да извикваме и управляваме подпроцес от Python. Следователно можем да изпълним всяка команда и да обработваме изхода й директно в Python.

  Наблюдението и управлението на Docker контейнер е лесно с тези 8 CLI инструмента

Забележка: Този метод работи само ако използвате Unix OS (Linux, Mac)

Отворете файл method3.py и поставете кода по-долу:

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

print(process.stdout)

Гмуркане в този код:

  • Ние внасяме изпълнява функция от модула на подпроцеса
  • Променливият процес съдържа резултата от изпълнението на командата du lorem.txt
    • du е помощна програма за Linux, която ни позволява да получим дисковото пространство на файл
    • capture_output ни дава достъп до атрибута standout (стандартен изход).
    • текст означава, че съхраняваме изхода като низ вместо байтове
  • Отпечатваме стандартния изход на процеса

Ако изпълните горния код, ще получите следния резултат:

20      lorem.txt

Както можете да видите, той ни дава размера и името на файла. Ако искате да получите само размера на файла, ще трябва да разделите изхода (не забравяйте, че е низ) и да отпечатате първия елемент.

from subprocess import run

process = run(['du', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Изход:

20

Този резултат изобщо не се чете. Можем да заключим, че използваната мерна единица е KB (поради предишните методи), но никой друг не може да познае размера на файла.

За да разрешим този проблем, можем да използваме флага -h (четим от човека).

Забележка: Можете да получите ръководство за тази команда, като стартирате man du или du ​​–help.

from subprocess import run

process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Сега резултатът от този скрипт ще бъде много по-четлив:

20K

Ако искате да научите повече за модула на подпроцеса и възможните приложения, вижте нашето ръководство за подпроцес на Python.

Вземете размера на папка рекурсивно

Ако искате да получите размера на папка, ще трябва да преминете през всеки файл, присъстващ в директорията и нейните поддиректории. Ще го направим с два метода:

  • Итериране на път с pathlib
  • Използване на командата du с подпроцес
  Как да използвате приложението iPhone Camera: The Ultimate Guide

Следният код ще използва път към тестова директория в моята домашна папка. Ще трябва да замените пътя на този файл за директорията, която искате да получите размера.

Итериране на път с pathlib

Нека да видим как можете да получите размера на директория чрез повторение на размерите на файловете.

from pathlib import Path
from humanize import naturalsize

def get_size(path="."):
    size = 0

    for file_ in Path(path).rglob('*'):

        size += file_.stat().st_size
    
    return naturalsize(size)

test_path = Path.home() / 'Documents/tests/'

print(get_size(test_path))

Тази част от кода изглежда малко плашеща, нека разбием какво прави всяка част.

  • Импортирайте класа Path и функцията naturalsize().
  • Дефинирайте функцията get_size() с параметър път, който сочи към текущата директория по подразбиране.
  • Променливата за размер е просто контейнер, в който ще добавяме размера на всеки файл
  • Обходете всеки файл от пътя
  • Вземете размера на всеки файл и го добавете към променливата размер
  • Връща променливата размер по разбираем за човека начин

Разбира се, тествам функцията с директория, налична само в моята машина. Не забравяйте да промените пътя до папка, която съществува на вашия компютър.

В моя случай получавам следния изход:

403.4 MB

Използване на командата du с подпроцес

Този подход има някои предимства:

  • Резултатът е малко по-точен
  • Много по-бързо е
from subprocess import run
from pathlib import Path

test_path = Path.home() / 'Documents/tests/'

process = run(['du', '-sh', test_path], capture_output=True, text=True)

size = process.stdout.split()[0]

print(size)

Използваме същия подход като метод 3, но този път получаваме размера на директория вместо на файл.

Изход:

481M

Както можете да видите, тези два начина за получаване на размера на папка връщат малко по-различен резултат. Колкото по-голяма е директорията, толкова по-голяма разлика ще получите.

От вас зависи да изберете между подхода pathlib или подпроцеса. Ако знаете, че ще използвате Linux всеки път, когато използвате подпроцес, в противен случай можете да използвате решението pathlib.

Да обобщим

Резултатите от Python са изключително удобни при взаимодействие с операционната система. Можете да автоматизирате процесите и да спестите много време с Python. Основните модули за взаимодействие с операционната система са os, sys, path и subprocess.

В този урок научихте:

  • Как Python взаимодейства с операционната система
  • Използването на вградени модули за извършване на операции с ОС
  • Как да използвате модула за хуманизиране, за да отпечатате, четим от хора
  • За изчисляване на размера на файл с 3 подхода
  • За изчисляване на размера на директория рекурсивно или с командата du