จะตรวจสอบขนาดไฟล์และโฟลเดอร์ใน Python ได้อย่างไร?
เผยแพร่แล้ว: 2021-06-16ในบทความนี้ คุณจะได้เรียนรู้วิธี ตรวจสอบขนาด ของไฟล์หรือโฟลเดอร์ใน Python
Python เป็นหนึ่งในภาษาโปรแกรมที่หลากหลายที่สุด ด้วยโปรแกรมนี้ คุณจะสามารถสร้างจากโปรแกรม CLI (Command-line interface) ขนาดเล็กไปจนถึงเว็บแอปพลิเคชันที่ซับซ้อนได้
อย่างไรก็ตาม หนึ่งในคุณสมบัติที่ประเมินค่าต่ำที่สุดคือความสามารถในการโต้ตอบกับระบบปฏิบัติการ การจัดการระบบปฏิบัติการด้วย Python ช่วยให้คุณประหยัดเวลาได้มากเมื่อสร้างกระบวนการอัตโนมัติ
มาดูกันว่า Python โต้ตอบกับ OS อย่างไร
Python โต้ตอบกับระบบปฏิบัติการอย่างไร

ไม่มีใครสามารถอยู่อย่างโดดเดี่ยวจากสภาพแวดล้อมของพวกเขาได้ นั่นยังใช้กับ Python ซึ่งบางครั้งเป็นพื้นฐานในการโต้ตอบกับระบบปฏิบัติการเพื่อทำงานให้เสร็จ
Python มีหลายโมดูลที่ให้เราโต้ตอบกับระบบปฏิบัติการ ที่ใช้กันมากที่สุดคือ os, sys, pathlib และ subprocess
เนื่องจากเป็นโมดูลในตัว คุณจึงไม่จำเป็นต้องติดตั้งด้วย PIP คุณสามารถนำเข้าทั้งหมดได้ด้วยคำสั่งต่อไปนี้:
import os import sys import pathlib import subprocessรายการด้านล่างระบุการทำงานหลักของการนำเข้าแต่ละรายการเหล่านี้:
- ระบบปฏิบัติการ: วิธีแบบพกพาในการใช้ฟังก์ชันเฉพาะระบบ (ขึ้นอยู่กับระบบปฏิบัติการของคุณ) เป็นทางเลือกที่เหมาะสมในกรณีส่วนใหญ่ เว้นแต่คุณต้องการขั้นสูงกว่านี้
- Sys: พารามิเตอร์และฟังก์ชันเฉพาะระบบ โมดูลนี้ให้การเข้าถึงตัวแปรและฟังก์ชันของล่าม โมดูลระบบปฏิบัติการโต้ตอบกับระบบปฏิบัติการและ sys โต้ตอบกับล่าม Python
- Pathlib: การใช้เส้นทางขั้นสูง ให้คุณแสดงระบบไฟล์เป็นอ็อบเจ็กต์ โดยมีความหมายที่เกี่ยวข้องสำหรับแต่ละ OS
- กระบวนการย่อย : การ ดำเนินการและการจัดการกระบวนการย่อยโดยตรงจาก Python ที่เกี่ยวข้องกับการทำงานกับ
stdin,stdoutและโค้ดส่งคืน คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับมันได้โดยอ่านคู่มือกระบวนการย่อยของ Python
มีไลบรารีระดับสูงที่มีฟังก์ชันเฉพาะมากขึ้นตามความต้องการของคุณ อย่างไรก็ตาม โดยส่วนใหญ่แล้ว คุณพร้อมจะใช้โมดูลด้านบนนี้
หมายเหตุ: ฟังก์ชันส่วนใหญ่ที่มีให้โดยโมดูลเหล่านี้จะมีเอาต์พุตที่แตกต่างกันไปขึ้นอยู่กับระบบปฏิบัติการของคุณ จำไว้ว่าโดยปกติ คู่ที่ดีที่สุดคือ UNIX และ Python
ตอนนี้คุณเข้าใจอย่างรวดเร็วแล้วว่า Python โต้ตอบกับ OS อย่างไร มาดูวิธีการตรวจสอบขนาดไฟล์และโฟลเดอร์กัน โซลูชันทั้งหมดต่อไปนี้มีอยู่ในขนาดไฟล์และโฟลเดอร์ในที่เก็บ 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 แสดงถึงขนาดของไฟล์
- เราพิมพ์ตัวแปร ขนาด
ลองเรียกใช้สคริปต์ Python คุณจะได้ผลลัพธ์ที่แตกต่างกันไปตามเนื้อหาของไฟล์ lorem.txt ของคุณ
เอาท์พุท:
20064ผลลัพธ์จะแสดงเป็นไบต์ สิ่งนี้ไม่สามารถอ่านได้เลย ดังนั้นเรามาทำให้เป็นมนุษย์กันเถอะ เพื่อให้เรามีมุมมองที่ดีขึ้นเกี่ยวกับขนาดของไฟล์
ขั้นแรก ติดตั้งแพ็คเกจ humanize โดยรันคำสั่งต่อไปนี้ในเชลล์ของคุณ:
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 และนำเข้าคลาส Path
from pathlib import Pathจากนั้นสร้างอ็อบเจ็กต์ Path ที่ส่งพาธไปยังไฟล์ lorem.txt เป็นอาร์กิวเมนต์
file_ = Path('lorem.txt')ตอนนี้คุณสามารถเข้าถึงเมธอด stat() ของคลาส Path ได้แล้ว มันทำงานเหมือนกับ ฟังก์ชัน os.stat() ดังนั้น คุณจะสามารถพิมพ์ขนาดของไฟล์ได้
print(file_.stat().st_size)เอาท์พุท:
20064อย่างที่คุณเห็น เราได้ผลลัพธ์เหมือนกับวิธีแรกที่เราใช้ ผลลัพธ์ข้างต้นยังถูกพิมพ์ในรูปแบบไบต์อีกด้วย ดังนั้นเราจึงสามารถใช้โมดูล humanize เพื่อให้อ่านได้
from pathlib import Path from humanize import naturalsize size = Path('lorem.txt').stat().st_size print(naturalsize(size))รหัสนี้สร้างผลลัพธ์ต่อไปนี้:
20.1 kBการใช้คำสั่ง Unix กับ Subprocess:
โมดูลกระบวนการย่อยช่วยให้เราสามารถเรียกและจัดการกระบวนการย่อยจาก Python ดังนั้นเราจึงสามารถรันคำสั่งใดๆ ก็ได้และจัดการกับผลลัพธ์ของมันโดยตรงใน Python

หมายเหตุ: วิธีนี้ใช้ได้เฉพาะเมื่อคุณใช้ระบบปฏิบัติการ Unix (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 ทำให้เราเข้าถึงแอตทริบิวต์ที่โดดเด่น (เอาต์พุตมาตรฐาน)
- text หมายความว่าเรากำลังจัดเก็บผลลัพธ์เป็นสตริงแทนที่จะเป็นไบต์
- เราพิมพ์ผลลัพธ์มาตรฐานของกระบวนการ
หากคุณเรียกใช้โค้ดด้านบน คุณจะได้รับผลลัพธ์ต่อไปนี้:
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 กับ subprocess
รหัสต่อไปนี้จะใช้เส้นทางไปยังไดเร็กทอรีทดสอบภายในโฟลเดอร์หลักของฉัน คุณจะต้องเปลี่ยนเส้นทางของไฟล์นั้นสำหรับไดเร็กทอรีที่คุณต้องการให้ได้ขนาด
วนซ้ำบนเส้นทางด้วย 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() ด้วย พาธ พารามิเตอร์ ซึ่งชี้ไปที่ไดเร็กทอรีปัจจุบันโดยค่าเริ่มต้น
- ตัวแปรขนาดเป็นเพียงตัวยึดตำแหน่งที่เราจะเพิ่มขนาดของแต่ละไฟล์
- วนซ้ำแต่ละไฟล์ของพาธ
- เมธอด rglob() จะส่งคืนไฟล์ที่ตรงกับรูปแบบซ้ำๆ
- rglob('*') หมายความว่าเราได้รับไฟล์ทั้งหมดภายในไดเร็กทอรี
- รับขนาดของแต่ละไฟล์และเพิ่มลงในตัวแปรขนาด
- ส่งกลับตัวแปรขนาดในแบบที่มนุษย์อ่านได้
แน่นอน ฉันกำลังทดสอบฟังก์ชันกับไดเร็กทอรีที่มีอยู่ในเครื่องของฉันเท่านั้น อย่าลืมเปลี่ยนเส้นทางไปยังโฟลเดอร์ที่มีอยู่ในคอมพิวเตอร์ของคุณ
ในกรณีของฉัน ฉันได้รับผลลัพธ์ต่อไปนี้:
403.4 MBการใช้ du Command กับ Subprocess
วิธีการนี้มีข้อดีบางประการ:
- ผลลัพธ์จะแม่นยำขึ้นเล็กน้อย
- เร็วกว่ามาก
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 ทุกครั้งที่ใช้ subprocess มิฉะนั้น คุณสามารถใช้โซลูชัน pathlib ได้
สรุป
ผลลัพธ์ของ Python มีประโยชน์อย่างยิ่งเมื่อโต้ตอบกับระบบปฏิบัติการ คุณสามารถทำให้กระบวนการเป็นอัตโนมัติและประหยัดเวลาได้มากด้วย Python โมดูลหลักในการโต้ตอบกับ os คือ os, sys, path และ subprocess
ในบทช่วยสอนนี้ คุณได้เรียนรู้:
- Python โต้ตอบกับ OS . อย่างไร
- การใช้โมดูลในตัวเพื่อดำเนินการระบบปฏิบัติการ
- วิธีใช้โมดูล humanize เพื่อพิมพ์ที่มนุษย์อ่านได้
- การคำนวณขนาดไฟล์ด้วย 3 วิธี
- ในการคำนวณขนาดของไดเร็กทอรีแบบเรียกซ้ำหรือด้วยคำสั่ง du
