Lấy danh sách tên file và thư mục theo điều kiện trong python | Laptrinhcanban.com

Lấy danh sách tên file và thư mục theo điều kiện trong python

Hướng dẫn cách Lấy danh sách tên file và thư mục theo điều kiện trong python. Bạn sẽ học được lấy danh sách tên file và thư mục theo điều kiện trong python bằng hàm glob.glob() hoặc phương thức Path.glob() sau bài học này.

Lấy danh sách tên file và thư mục theo điều kiện trong python | glob.glob()

Để lấy danh sách tên file và thư mục phù hợp với điều kiện chỉ định, chúng ta sử dụng hàm glob.blog() với cú pháp sau đây:

glob.glob(pattern, *, recursive=False)

Trong đó

  • pattern là định dạng đường dẫn của file hoặc thư mục cần lấy.
  • recursive chỉ định có sử dụng đệ quy hay không. Nếu recursive=True, chúng ta có thể lấy danh sách đệ quy tất cả file hay thư mục, bao gồm cả trong các thư mục con từ thư mục chỉ định.

Hàm sẽ trả về một list chứa tên của tất cả file và thư mục trong thư mục chỉ định mà có đường dẫn phù hợp với định dạng trong pattern.

Khi định dạng pattern, chúng ta có thể sử dụng kèm các ký tự đặc biệt sau đây để chỉ định điều kiện của đường dẫn

Ký tựÝ nghĩaVí dụ
*một chuỗi ký tự bất kỳglob.glob(“*.txt”)
?một ký tự đơn bất kỳglob.glob(“./?”)
[]một ký tự đơn trong phạm viglob.glob(“./[0-9]”)

Lấy danh sách tên file và thư mục khớp với một chuỗi ký tự bất kỳ | *

Ký tự * biểu thị điều kiện đường dẫn cần khớp với một chuỗi ký tự bất kỳ.
Ví dụ khi chỉ định *.txt , kết quả trả về sẽ là danh sách tên các file hoặc thư mục khớp với định dạng một chuỗi ký tự bất kỳ + .txt. Ví dụ như user.txt hoặc address.txt.

Ví dụ, bạn có một thư mục có cấu trúc như sau:

data/
├── user
│   ├── dir1
│   ├── dir2
│   │     └── name.txt
│   ├── pass.txt
│   ├── direct.txt
│   └── user.txt
├── client
└── move.py

Với mã lệnh sau đây, chúng ta sẽ lấy danh sách tên tất cả các file có đuôi .txt có trong thư mục user:

import glob

for name in glob.glob('./user/*.txt'):
print(name)
# address.txt
# pass.txt
# user.txt

Với mã lệnh sau đây, chúng ta sẽ lấy danh sách tên tất cả các file và thư mục bắt đầu bởi ký tự d:

import glob

for name in glob.glob('./user/d*'):
print(name)
# dir1
# dir2
# direct.txt

Lấy danh sách tên file và thư mục khớp với một ký tự đơn bất kỳ | ?

Ký tự ? biểu thị điều kiện đường dẫn cần khớp với một ký tự đơn bất kỳ.
Ví dụ khi chỉ định ?.txt , kết quả trả về sẽ là danh sách tên các file hoặc thư mục khớp với định dạng một ký tự bất kỳ + .txt. Ví dụ như a.txt hoặc b.txt.

Ví dụ với cùng thư mục có cấu trúc như ở phần trên, với mã lệnh sau đây, chúng ta sẽ lấy danh sách tên tất cả các file có 4 ký tự, và có đuôi là .txt:

import glob

for name in glob.glob('./user/????.txt'):
print(name)
# pass.txt
# user.txt

Lấy danh sách tên file và thư mục khớp một ký tự đơn trong phạm vi | []

Ký tự [] viểu thị điều kiện đường dẫn cần khớp với một ký tự bất kỳ nằm giữa cặp dấu [].
Ví dụ khi chỉ định 123[45].txt , kết quả trả về sẽ là danh sách tên các file hoặc thư mục khớp với định dạng 123 + 4 hoặc 5. Ví dụ như 1234.txt hoặc 1235.txt.

Lại nữa, chúng ta cũng có thể dùng cách viết biểu thị phạm vi bằng cách dùng dấu -, ví dụ như [1-3] để biểu thị [123], hoặc [a-f] để biểu thị [abcdef].

Ví dụ, chúng ta dùng mã lệnh sau để lấy danh sách tên tất cả các file và thư mục bắt đầu bởi một trong các chữ cái [a-d], và có đuôi là .txt:

import glob

for name in glob.glob('./user/[a-d]*.txt'):
print(name)
# dir1
# dir2
# address.txt

Sử dụng ký tự đặc biệt *? như một ký tự bình thường

Trong trường hợp bạn muốn dùng các ký tự đặc biệt *? như một ký tự bình thường khi chỉ định điều kiện, hãy đặt chúng giữa cặp dấu [], ví dụ như [*][?].

Lấy danh sách đệ quy tên file và thư mục theo điều kiện trong python | recursive = True

Khi sử dụng hàm glob.glob() để lấy danh sách file và thư mục theo điều kiện trong python, nếu chúng ta chỉ định giá trị đối số recursive = True, một danh sách đệ quy bao gồm cả các file và thư mục chứa trong thư mục con cũng sẽ được lấy ra.
Và nếu chỉ định pattern của bằng ký tự đặc biệt *, chúng ta có thể chỉ định điều kiện để lấy file và thư mục ra.

Vó dụ, chúng ta dùng * để biểu thị khớp với bất kỳ tên thư mục nào cùng cấp, và dùng ** để biểu thị khớp với bất kỳ tên thư mục trung gian, như ví dụ sau:

print(glob.glob('data/user/*/*.text'))
# ['ata/user/name.text']

print(glob.glob('data/**/*.text', recursive=True))
# ['data/user/user.txt', 'data/user/direct.txt', 'data/user/pass.txt', 'data/user/dir2/name.text']

Ngoài ra, chúng ta sử dụng cách viết tên thư mục + /** để lấy toàn bộ file và thư mục có trong một thư mục mẹ như sau:

print(glob.glob('user/**', recursive=True))
# ['./user/', './user/dir1', './user/dir2','./user/dir2/name.txt']

Bạn cũng có thể viết dưới dạng gắn biến như sau:

path='./user'

print(glob.glob(path+'/**', recursive=True))
# ['user/', 'user/dir1', 'user/dir2','user/dir2/name.txt']

Lấy danh sách tên file và thư mục theo điều kiện trong python | Path.glob()

Chúng ta cũng có thể sử dụng phương thức Path.glob() tích hợp trong module pathlib để lấy danh sách tên file và thư mục theo điều kiện trong python, với cú pháp sau đây:

Path.glob(pattern)

Trong đó Path là một instance được tạo ra từ class pathlib.Path() chứa thông tin đường dẫn của thư mục gốc.
Pattern cũng giống như với hàm lob.glob(), là định dạng đường dẫn của file hoặc thư mục cần lấy, gồm *, ?[]. Cách sử dụng các ký tự đặc biệt này tương tự như Kiyoshi đã hướng dẫn ở phần trên.

Sau đây chúng ta sẽ xem một vài ví dụ cụ thể hơn về cách lấy danh sách tên file và thư mục theo điều kiện trong python bằng path.glob().

Cũng với thư mục có cấu trúc ở trên:

data/
├── user
│   ├── dir1
│   ├── dir2
│   │     └── name.txt
│   ├── pass.txt
│   ├── direct.txt
│   └── user.txt
├── client
└── move.py

Chúng ta lần lượt chỉ định các pattern để lấy danh sách tên các file và thư mục phù hợp với điều kiện như sau:

import pathlib

p = pathlib.Path('./user/*.txt')
for name in p.glob('[a-d]*.txt'):
print(name)
# dir1
# dir2
# address.txt

for name in p.glob('./user/????.txt'):
print(name)
# pass.txt
# user.txt

for name in p.glob('./user/????.txt'):
print(name)
# pass.txt
# user.txt

Lấy danh sách đệ quy tên file và thư mục theo điều kiện trong python | Path.glob()

Tương tự với hàm glob.glob(), chúng ta cũng có thể sử dụng phương thức path.glob() để lấy danh sách đệ quy tên file và thư mục theo điều kiện trong python.
Có một điểm khác là hàm glob.glob() cần chỉ định recursive=True làm đối số thì mới có thể xử lý đệ quy, trong khi với phương thức path.glob() thì về mặc định xử lý đã là xử lý đệ quy rồi.
Chúng ta sẽ kết hợp cách viết ** khi chỉ định pattern của đường dẫn như sau:

import pathlib

p = pathlib.Path('./user')
for name in p.glob('**/*.txt'):
print(name)
#./user/pass.txt
#./user/directdirec.txt
#./user/user.txt
#./user/dir2/name.txt

Tổng kết và thực hành

Trên đây Kiyoshi đã hướng dẫn bạn về cách lấy danh sách tên file và thư mục theo điều kiện trong python rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về python trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.