Како проверити величину датотеке и фасцикле у Питхон-у?

У овом чланку ћете научити да проверите величину датотеке или фасцикле у Питхон-у

Питхон је један од најсвестранијих програмских језика. Са њим ћете моћи да направите од малог ЦЛИ (интерфејса командне линије) програма до сложене веб апликације.

Међутим, једна од његових најпотцењенијих карактеристика је способност интеракције са оперативним системима. Управљање операцијама ОС помоћу Питхон-а може вам уштедети много времена приликом креирања процеса аутоматизације.

Хајде да видимо како Питхон комуницира са ОС-ом.

Како Питхон комуницира са оперативним системом?

Нико не може да живи изолован од свог окружења. То важи и за Питхон, где је понекад од суштинског значаја интеракција са оперативним системом да би се ствари обавиле.

Питхон има неколико модула који нам омогућавају интеракцију са ОС-ом. Највише се користе ос, сис, патхлиб и подпроцес.

Пошто су то уграђени модули, нећете морати да их инсталирате са ПИП-ом. Можете их све увести помоћу следеће изјаве:

import os
import sys
import pathlib
import subprocess

Листа у наставку показује главне функције сваког од ових увоза:

  • Ос: Преносиви начин коришћења функционалности специфичне за систем (у зависности од вашег ОС). То је прави избор у већини случајева осим ако вам није потребно нешто напредније
  • Сис: Системски специфични параметри и функције. Овај модул омогућава приступ варијаблама и функцијама тумача. Ос модул је у интеракцији са оперативним системом, а сис у интеракцији са Питхон интерпретером
  • Патхлиб: Напредно коришћење путање. Омогућава вам да представите системе датотека као објекте, са одговарајућом семантиком за сваки ОС.
  • Подпроцес: Извршавање и управљање подпроцесима директно из Питхон-а. То укључује рад са стдин, стдоут и повратним кодовима. Можете сазнати више о томе читајући наш водич за подпроцесе за Питхон.

Постоје библиотеке високог нивоа које укључују још специфичнију функционалност у зависности од ваших потреба. Међутим, већину времена је добро да користите горе наведене модуле.

Напомена: Већина функција које пружају ови модули ће имати другачији излаз у зависности од вашег ОС. Запамтите да је обично најбоља утакмица УНИКС и Питхон.

  Како добити проверену квачицу у ТикТок-у

Сада имате брзо разумевање о томе како Питхон комуницира са ОС-ом, хајде да скочимо на методе провере величине датотеке и фасцикле. Сва следећа решења су доступна у Величина датотеке и фасцикле у Питхон-у ГитХуб спремиште

Коришћењем ос.стат().ст_сизе

У овој методи ћемо користити стат() функција из ос модула. Враћа много информација о одређеној путањи.

Напомена: функција ос.патх.гетсизе() такође обавља посао. Предност коришћења ос.стат().ст_сизе је у томе што не прати симлинкове.

Пре него што наставимо, хајде да направимо датотеку за тестирање под називом лорем.ткт, у коју ћемо налепити неки глупи текст. Можемо посетити а Лорем Ипсум генератор текста и налепите текст у датотеку лорем.ткт.

У истом директоријуму направите датотеку са именом метход1.пи и налепите код испод:

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

Хајде да разложимо шта радимо са овим кодом:

  • У првом реду увозимо ос модул
  • Променљива величине садржи величину датотеке лорем.ткт
    • Функција ос.стат() враћа гомилу информација у вези са датотеком
    • Атрибут ст_сизе представља величину датотеке
  • Штампамо променљиву величине

Покушајте да покренете Питхон скрипту. Добићете другачији резултат у зависности од садржаја ваше датотеке лорем.ткт.

Излаз:

20064

Излаз је представљен у бајтовима. Ово уопште није читљиво, па хајде да га хуманизујемо да бисмо имали бољу перспективу о величини датотеке.

Прво, инсталирајте хуманизовати пакет, покретањем следеће команде у вашој љусци:

pip install humanize

Затим можете користити функцију натуралсизе() која конвертује вредност у бајтовима у читљиву величину датотеке, на пример, КБ, МБ, ГБ или ТБ.

import os
from humanize import naturalsize

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

print(size)
print(naturalsize(size))

У почетку, горњи код штампа величину датотеке у бајтовима, а затим штампа резултат у читљивој величини.

Излаз:

20064
20.1 kB

Коришћење Патхлиб-а

Мада патхлиб је дизајниран да ради искључиво са путањама, инкорпорира неке корисне функције из других модула као методе Патх објеката (Инстанце класе Патх).

Направите датотеку метход2.пи и увезите датотеку Класа путање.

from pathlib import Path

Затим креирајте објекат Патх који као аргумент прослеђује путању до датотеке лорем.ткт.

file_ = Path('lorem.txt')

Сада можете приступити методи стат() класе Патх. Ради исто као функција ос.стат(), тако да ћете моћи да одштампате величину датотеке.

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

Коришћење Уник команди са подпроцесом:

Модул подпроцеса нам омогућава да позивамо и управљамо подпроцесом из Питхона. Стога можемо покренути било коју команду и третирати њен излаз директно у Питхон-у.

  12 најбољих гигабитних прекидача са 5 портова за подешавање ваше мреже

Напомена: Овај метод функционише само ако користите Уник ОС (Линук, Мац)

Отворите датотеку метход3.пи и налепите код испод:

from subprocess import run

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

print(process.stdout)

Уроните у овај део кода:

  • Ми увозимо функција покретања из подпроцесног модула
  • Променљиви процес садржи резултат покретања команде ду лорем.ткт
    • ду је Линук услужни програм који нам омогућава да добијемо простор на диску датотеке
    • цаптуре_оутпут нам даје приступ атрибуту стандоут (стандардни излаз).
    • текст значи да чувамо излаз као стринг уместо бајтова
  • Штампамо стандардни излаз процеса

Ако покренете горњи код, добићете следећи излаз:

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

Овај излаз уопште није читљив. Можемо закључити да је јединица мере КБ (због претходних метода), али нико други није могао да погоди величину датотеке.

Да бисмо решили овај проблем, можемо користити -х (људски читљива) заставицу.

Напомена: Можете добити приручник за ову команду тако што ћете покренути ман ду или ду –хелп.

from subprocess import run

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

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

print(size)

Сада ће излаз ове скрипте бити много читљивији:

20K

Ако желите да сазнате више о модулу подпроцеса и могућим апликацијама, погледајте наш водич за Питхон подпроцес.

Добијте величину фасцикле рекурзивно

Ако желите да добијете величину фасцикле, мораћете да пређете преко сваке датотеке присутне у директоријуму и његовим поддиректоријумима. Урадићемо то на два начина:

  • Итерација преко путање са патхлиб
  • Коришћење наредбе ду са подпроцесом
  Обавезна апликација за пројекте која се фокусира на рокове [iOS]

Следећи код ће користити путању до тест директоријума унутар моје почетне фасцикле. Мораћете да замените путању те датотеке за директоријум који желите да добијете величину.

Итерација преко путање са патхлиб

Хајде да видимо како можете да добијете величину директоријума итерацијом преко величина датотека.

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))

Овај део кода изгледа помало застрашујуће, хајде да разложимо шта сваки део ради.

  • Увезите класу Патх и функцију натуралсизе().
  • Дефинишите функцију гет_сизе() помоћу путање параметра, која подразумевано указује на тренутни директоријум.
  • Променљива величине је само чувар места у који ћемо додати величину сваке датотеке
  • Итерирајте преко сваке датотеке путање
  • Добијте величину сваке датотеке и додајте је променљивој величине
  • Враћа променљиву величине на читљив начин

Наравно, тестирам функцију са директоријумом који је доступан само на мојој машини. Не заборавите да промените путању до фасцикле која постоји на вашем рачунару.

У мом случају добијам следећи излаз:

403.4 MB

Коришћење команде ду са подпроцесом

Овај приступ има неке предности:

  • Резултат је мало тачнији
  • То је много брже
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

Као што видите ова два начина за добијање величине фасцикле, враћају се нешто другачији резултат. Што је већи директоријум то ћете добити већу разлику.

На вама је да изаберете између приступа патхлиб или подпроцеса. Ако знате да ћете користити Линук сваки пут када користите подпроцес, иначе можете користити решење патхлиб.

Да сумирам

Питхон резултати су изузетно згодни при интеракцији са ОС-ом. Можете да аутоматизујете процесе и уштедите много времена уз Питхон. Главни модули за интеракцију са оперативним системом су ос, сис, путања и подпроцес.

У овом водичу сте научили:

  • Како Питхон комуницира са ОС-ом
  • Употреба уграђених модула за обављање операција ОС
  • Како користити модул хуманизе за штампање читљиво за људе
  • Да израчунате величину датотеке са 3 приступа
  • Да израчунате величину директоријума рекурзивно или помоћу команде ду