كيفية التحقق من حجم الملف والمجلد في بايثون؟

نشرت: 2021-06-16

في هذه المقالة ، ستتعلم التحقق من حجم ملف أو مجلد في Python

Python هي واحدة من أكثر لغات البرمجة تنوعًا. باستخدامه ، ستتمكن من الإنشاء من برنامج CLI (واجهة سطر الأوامر) صغير إلى تطبيق ويب معقد.

ومع ذلك ، فإن إحدى ميزاته التي لا يتم تقديرها كثيرًا هي القدرة على التفاعل مع أنظمة التشغيل. يمكن أن توفر لك إدارة عمليات نظام التشغيل باستخدام Python الكثير من الوقت عند إنشاء عمليات التشغيل الآلي.

دعونا نرى كيف تتفاعل Python مع نظام التشغيل.

كيف تتفاعل Python مع نظام التشغيل؟

يتفاعل Python مع نظام التشغيل مع وحدات التشغيل ، والنظام ، والمسار ، والعمليات الفرعية

لا أحد يستطيع أن يعيش معزولا عن بيئته. ينطبق هذا أيضًا على Python ، حيث يكون التفاعل مع نظام التشغيل لإنجاز المهام أمرًا أساسيًا في بعض الأحيان.

تحتوي Python على العديد من الوحدات النمطية التي تتيح لنا التفاعل مع نظام التشغيل. الأكثر استخدامًا هي os و sys و pathlib و subprocess.

نظرًا لأنها وحدات مدمجة ، فلن تحتاج إلى تثبيتها باستخدام PIP. يمكنك استيرادها جميعًا بالبيان التالي:

 import os import sys import pathlib import subprocess

توضح القائمة أدناه الوظيفة الرئيسية لكل من هذه الواردات:

  • Os: طريقة محمولة لاستخدام وظائف خاصة بالنظام (اعتمادًا على نظام التشغيل الخاص بك). إنه الاختيار الصحيح في معظم الحالات ما لم تكن بحاجة إلى شيء أكثر تقدمًا
  • Sys: المعلمات والوظائف الخاصة بالنظام. توفر هذه الوحدة الوصول إلى متغيرات ووظائف المترجم الفوري. تتفاعل وحدة نظام التشغيل مع نظام التشغيل ويتفاعل النظام مع مترجم بايثون
  • Pathlib: استخدام المسار المتقدم. يتيح لك تمثيل أنظمة الملفات ككائنات ، مع الدلالات ذات الصلة لكل نظام تشغيل.
  • العملية الفرعية: التنفيذ وإدارة العمليات الفرعية مباشرة من Python. يتضمن ذلك العمل مع رموز stdin و stdout و return. يمكنك معرفة المزيد عنها من خلال قراءة دليل العمليات الفرعية لبايثون.

توجد مكتبات عالية المستوى تتضمن وظائف أكثر تحديدًا وفقًا لاحتياجاتك. ومع ذلك ، في معظم الأوقات ، من الجيد استخدام الوحدات المذكورة أعلاه.

ملاحظة: سيكون لمعظم الوظائف التي توفرها هذه الوحدات إخراج مختلف اعتمادًا على نظام التشغيل الخاص بك. تذكر أنه عادةً ما يكون أفضل تطابق هو UNIX و Python.

الآن لديك فهم سريع لكيفية تفاعل Python مع نظام التشغيل ، دعنا ننتقل إلى طرق التحقق من حجم الملف والمجلد. تتوفر جميع الحلول التالية في حجم الملف والمجلد في مستودع Python GitHub

باستخدام os.stat (). st_size

في هذه الطريقة ، سنستخدم دالة stat () من وحدة نظام التشغيل. يقوم بإرجاع الكثير من المعلومات حول مسار معين.

ملاحظة: تنجز الوظيفة () os.path.getsize () المهمة أيضًا. ميزة استخدام os.stat (). st_size هو أنه لا يتبع simlinks.

قبل المتابعة ، دعنا ننشئ ملف اختبار باسم lorem.txt ، والذي سنقوم فيه بلصق بعض النصوص الغبية . يمكننا زيارة مولد نص Lorem Ipsum ولصق النص في ملف lorem.txt .

في نفس الدليل ، أنشئ ملفًا بالاسم method1.py والصق الكود أدناه:

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

دعنا نقسم ما نفعله بهذا الكود:

  • في السطر الأول ، نقوم باستيراد وحدة نظام التشغيل
  • يحتوي متغير الحجم على حجم الملف lorem.txt
    • ترجع الدالة os.stat () مجموعة من المعلومات المتعلقة بالملف
    • السمة st_size تمثل حجم الملف
  • نقوم بطباعة متغير الحجم

حاول تشغيل نص بايثون. ستحصل على نتيجة مختلفة بناءً على محتوى ملف 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 مصمم للعمل حصريًا مع المسارات ، إلا أنه يشتمل على بعض الوظائف المفيدة من الوحدات النمطية الأخرى كطرق لكائنات المسار (مثيلات فئة المسار).

قم بإنشاء ملف method2.py واستيراد فئة المسار.

 from pathlib import Path

ثم قم بإنشاء كائن مسار يمرر المسار إلى ملف lorem.txt كوسيطة.

 file_ = Path('lorem.txt')

الآن ، يمكنك الوصول إلى طريقة stat () لفئة المسار. وهي تعمل بنفس وظيفة 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

استخدام أوامر يونكس مع عملية فرعية:

تسمح لنا وحدة العملية الفرعية باستدعاء وإدارة العملية الفرعية من Python. لذلك يمكننا تشغيل أي أمر ومعالجة مخرجاته مباشرة في Python.

ملاحظة: تعمل هذه الطريقة فقط إذا كنت تستخدم نظام تشغيل 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 الوصول إلى السمة المميزة (الإخراج القياسي)
    • يعني النص أننا نخزن الإخراج كسلسلة بدلاً من بايت
  • نقوم بطباعة الإخراج القياسي للعملية

إذا قمت بتشغيل الكود أعلاه ، فستحصل على الإخراج التالي:

 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

هذا الإخراج غير قابل للقراءة على الإطلاق. يمكننا أن نستنتج أن وحدة القياس المستخدمة هي كيلو بايت (بسبب الطرق السابقة) ، ولكن لا يمكن لأي شخص آخر تخمين حجم الملف.

لحل هذه المشكلة ، يمكننا الاستفادة من العلامة -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

إذا كنت تريد معرفة المزيد عن وحدة العملية الفرعية والتطبيقات الممكنة ، فراجع دليل العملية الفرعية لبايثون.

احصل على حجم المجلد بشكل متكرر

إذا كنت ترغب في الحصول على حجم المجلد ، فستحتاج إلى تكرار كل ملف موجود في الدليل والأدلة الفرعية الخاصة به. سنفعل ذلك بطريقتين:

  • التكرار على مسار باستخدام pathlib
  • استخدام أمر du مع عملية فرعية

سيستخدم الكود التالي مسارًا إلى دليل اختبار داخل مجلد منزلي. ستحتاج إلى استبدال مسار هذا الملف للدليل الذي تريده للحصول على الحجم.

التكرار على مسار باستخدام 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))

يبدو هذا الجزء من الكود مخيفًا بعض الشيء ، فلنقم بتفصيل ما يفعله كل جزء.

  • قم باستيراد فئة المسار ووظيفة Naturalsize ()
  • حدد دالة get_size () بمسار معلمة يشير إلى الدليل الحالي افتراضيًا.
  • متغير الحجم هو مجرد عنصر نائب سنضيف فيه حجم كل ملف
  • كرر فوق كل ملف من ملفات المسار
    • تقوم طريقة rglob () بإرجاع الملفات التي تطابق النمط بشكل متكرر
    • rglob ('*') ، يعني أننا نحصل على جميع الملفات داخل الدليل
  • احصل على حجم كل ملف وأضفه إلى متغير الحجم
  • إرجاع متغير الحجم بطريقة يمكن للبشر قراءتها

بالطبع ، أقوم باختبار الوظيفة بدليل متاح فقط في جهازي. لا تنس تغيير المسار إلى مجلد موجود على جهاز الكمبيوتر الخاص بك.

في حالتي ، أحصل على الإخراج التالي:

 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)

نحن نستخدم نفس الطريقة المستخدمة في الطريقة الثالثة ، ولكن هذه المرة نحصل على حجم الدليل بدلاً من الملف.

انتاج:

 481M

كما ترى هاتين الطريقتين للحصول على حجم المجلد ، يتم إرجاع نتيجة مختلفة قليلاً. كلما زاد حجم الدليل ، زاد الاختلاف الذي ستحصل عليه.

والامر متروك لكم لاختيار بين pathlib أو نهج فرعي أو جانبي. إذا كنت تعلم أنك ستستخدم Linux في كل مرة تستخدم فيها عملية فرعية ، فيمكنك استخدام حل pathlib.

لنلخص

نتائج Python سهلة للغاية عند التفاعل مع نظام التشغيل. يمكنك أتمتة العمليات وتوفير الكثير من الوقت باستخدام Python. الوحدات الرئيسية للتفاعل مع نظام التشغيل هي نظام التشغيل ونظام التشغيل والمسار والعملية الفرعية.

تعلمت في هذا البرنامج التعليمي:

  • كيف تتفاعل بايثون مع نظام التشغيل
  • استخدام الوحدات المدمجة لإجراء عمليات نظام التشغيل
  • كيفية استخدام وحدة إضفاء الطابع البشري على طباعة يمكن للبشر قراءتها
  • لحساب حجم ملف بثلاث طرق
  • لحساب حجم دليل بشكل متكرر أو باستخدام أمر du