จะตรวจสอบขนาดไฟล์และโฟลเดอร์ใน Python ได้อย่างไร?

เผยแพร่แล้ว: 2021-06-16

ในบทความนี้ คุณจะได้เรียนรู้วิธี ตรวจสอบขนาด ของไฟล์หรือโฟลเดอร์ใน Python

Python เป็นหนึ่งในภาษาโปรแกรมที่หลากหลายที่สุด ด้วยโปรแกรมนี้ คุณจะสามารถสร้างจากโปรแกรม CLI (Command-line interface) ขนาดเล็กไปจนถึงเว็บแอปพลิเคชันที่ซับซ้อนได้

อย่างไรก็ตาม หนึ่งในคุณสมบัติที่ประเมินค่าต่ำที่สุดคือความสามารถในการโต้ตอบกับระบบปฏิบัติการ การจัดการระบบปฏิบัติการด้วย Python ช่วยให้คุณประหยัดเวลาได้มากเมื่อสร้างกระบวนการอัตโนมัติ

มาดูกันว่า Python โต้ตอบกับ OS อย่างไร

Python โต้ตอบกับระบบปฏิบัติการอย่างไร

Python โต้ตอบกับ Os กับ os, sys, path และ subprocess modules

ไม่มีใครสามารถอยู่อย่างโดดเดี่ยวจากสภาพแวดล้อมของพวกเขาได้ นั่นยังใช้กับ 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