รับรายชื่อไฟล์และไดเร็กทอรีใน Python

ธุรกิจ

ในการรับรายชื่อไฟล์และชื่อไดเร็กทอรี (ชื่อโฟลเดอร์) ใน Python ให้ใช้ฟังก์ชัน os module os.listdir()

os.listdir(path=’.’)
ส่งคืนรายการที่มีชื่อรายการในไดเร็กทอรีที่ระบุโดยพาธ
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

โมดูลระบบปฏิบัติการรวมอยู่ในไลบรารีมาตรฐานและไม่จำเป็นต้องติดตั้ง อย่างไรก็ตาม จำเป็นต้อง “นำเข้า”

ข้อมูลต่อไปนี้มีให้ที่นี่

  • รับรายชื่อทั้งชื่อไฟล์และไดเร็กทอรี
  • รับรายชื่อไฟล์เท่านั้น
  • รับรายชื่อไดเร็กทอรีเท่านั้น

ต่อไปนี้เป็นตัวอย่างของโครงสร้างไฟล์ (ไดเร็กทอรี)

.
└── testdir
    ├── dir1
    ├── dir2
    ├── file1
    ├── file2.txt
    └── file3.jpg

นอกจาก os.listdir() แล้ว คุณยังสามารถใช้โมดูล glob เพื่อรับรายชื่อไฟล์และชื่อไดเร็กทอรี (ชื่อโฟลเดอร์) glob อนุญาตให้คุณระบุเงื่อนไขโดยใช้สัญลักษณ์แทน (*) ฯลฯ และรวมไดเรกทอรีย่อยแบบเรียกซ้ำ

ใน Python 3.4 และใหม่กว่า ยังสามารถรับรายการไฟล์และไดเร็กทอรีโดยใช้โมดูล pathlib ซึ่งสามารถจัดการพาธเป็นอ็อบเจ็กต์ได้ เช่นเดียวกับ globs ด้านบน สามารถใช้แบบมีเงื่อนไขและแบบเรียกซ้ำได้

รับรายชื่อทั้งชื่อไฟล์และไดเร็กทอรี

หากคุณใช้ os.listdir() ตามที่เป็นอยู่ มันจะส่งคืนรายการของทั้งชื่อไฟล์และไดเร็กทอรี

import os

path = "./testdir"

files = os.listdir(path)
print(type(files))  # <class 'list'>
print(files)        # ['dir1', 'dir2', 'file1', 'file2.txt', 'file3.jpg']

สิ่งที่คุณได้รับคือรายการสตริงพาธ

รับรายชื่อไฟล์เท่านั้น

หากคุณต้องการรับรายชื่อไฟล์เท่านั้น ให้ใช้ฟังก์ชัน os.path.isfile() เพื่อตรวจสอบว่าพาธเป็นไฟล์หรือไม่ การส่งเฉพาะชื่อไฟล์เป็นอาร์กิวเมนต์ของฟังก์ชัน os.path.isfile() จะไม่ทำงาน ดังนั้นให้ส่งพาธแบบเต็มตามที่แสดงด้านล่าง
os.path.isfile(os.path.join(path, f))

files = os.listdir(path)
files_file = [f for f in files if os.path.isfile(os.path.join(path, f))]
print(files_file)   # ['file1', 'file2.txt', 'file3.jpg']

รับรายชื่อไดเร็กทอรีเท่านั้น

หากคุณต้องการรับรายชื่อไดเรกทอรีเท่านั้น ให้ใช้ os.path.isdir() ในลักษณะเดียวกัน

files = os.listdir(path)
files_dir = [f for f in files if os.path.isdir(os.path.join(path, f))]
print(files_dir)    # ['dir1', 'dir2']