Nhiều cách để liệt kê file/thư mục trong Python, từ cơ bản đến nâng cao.
1. os.listdir() - Cơ bản nhất
import os
# Thư mục hiện tại
for x in os.listdir('.'):
print(x)
# Thư mục cụ thể
for x in os.listdir(r'C:\Python\Python361\selenium'):
print(x)
2. Phân biệt file vs thư mục
for x in os.listdir('.'):
if os.path.isfile(x):
print('file-', x)
elif os.path.isdir(x):
print('directory-', x)
elif os.path.islink(x):
print('link-', x)
3. Lọc với filter() / list comprehension
# Chỉ file
files = list(filter(lambda x: os.path.isfile(x), os.listdir('.')))
# Chỉ thư mục
dirs = list(filter(lambda x: os.path.isdir(x), os.listdir('.')))
# File .txt
txt_files = [x for x in os.listdir('.') if x.endswith('.txt')]
# Regex: file .txt hoặc .py
import re
pattern = re.compile(r'\.(txt|py)$')
matched = list(filter(pattern.search, os.listdir('.')))
4. os.walk() - Đệ quy (recursive)
Duyệt toàn bộ cây thư mục con.
for root, dirs, files in os.walk(r'C:\Python\Python361\selenium'):
for filename in files:
print(os.path.join(root, filename))
5. pathlib (Python 3.4+) - Hiện đại, OOP
from pathlib import Path
p = Path('.')
# Tất cả file/thư mục
for item in p.iterdir():
print(item)
# Chỉ file .txt
for txt in p.glob('*.txt'):
print(txt)
# Đệ quy tìm .py
for py in p.rglob('*.py'):
print(py)
# Thông tin file
for item in p.iterdir():
print(item.name, item.is_file(), item.is_dir(), item.stat().st_size)
6. glob module - Pattern matching
import glob
# File .txt trong thư mục hiện tại
glob.glob('*.txt')
# Đệ quy ** (Python 3.5+)
glob.glob('**/*.py', recursive=True)
# Với path tuyệt đối
glob.glob(r'C:\Python\**\*.py', recursive=True)
So sánh nhanh
| os.listdir | Nhanh, đơn giản, không đệ quy |
| os.walk | Đệ quy đầy đủ, trả về (root, dirs, files) |
| pathlib | OOP, path object, method chaining, khuyến nghị Python 3.4+ |
| glob | Pattern matching mạnh, hỗ trợ ** đệ quy |