Cách sử dụng module pathlib để thao tác đường dẫn hệ thống tệp trong Python 3
Python 3 bao gồm mô-đunpathlib
để điều khiển các đường dẫn hệ thống file về mặt nông học dù hệ điều hành nào. pathlib
tương tự như mô-đun os.path
, nhưng pathlib
cung cấp một giao diện cấp cao hơn - và thường tiện lợi hơn nhiều lần so với os.path
. Ta có thể xác định các file trên máy tính bằng các đường dẫn phân cấp. Ví dụ: ta có thể xác định file wave.txt
trên máy tính bằng đường dẫn sau: /Users/ sammy /ocean/wave.txt
. Hệ điều hành thể hiện các đường dẫn hơi khác một chút. Windows có thể đại diện cho đường dẫn đến file wave.txt
như C:\Users\ sammy \ocean\wave.txt
.
Bạn có thể thấy module pathlib
hữu ích nếu trong chương trình Python của bạn , bạn đang tạo hoặc di chuyển file trên hệ thống file , liệt kê các file trên hệ thống file phù hợp với một phần mở rộng hoặc mẫu nhất định hoặc tạo đường dẫn file thích hợp cho hệ điều hành dựa trên tập hợp các chuỗi thô. Mặc dù bạn có thể sử dụng các công cụ khác (như module os.path
) để thực hiện nhiều tác vụ này, nhưng module pathlib
cho phép bạn thực hiện các hoạt động này với mức độ dễ đọc cao và số lượng mã tối thiểu.
Trong hướng dẫn này, ta sẽ xem xét một số cách sử dụng module pathlib
để biểu diễn và thao tác các đường dẫn hệ thống file .
Yêu cầu
Để tận dụng tối đa hướng dẫn này, bạn nên làm quen với lập trình bằng Python 3. Bạn có thể xem lại các hướng dẫn này để biết thông tin cơ bản cần thiết:
Tạo các version Path
Mô-đun pathlib
cung cấp một số lớp , nhưng một trong những lớp quan trọng nhất là lớp Path
. Các version của lớp Path
đại diện cho một đường dẫn đến một file hoặc folder trên hệ thống file của máy tính của ta .
Ví dụ: mã sau khởi tạo một version Path
đại diện cho một phần của đường dẫn đến file wave.txt
:
from pathlib import Path wave = Path("ocean", "wave.txt") print(wave)
Nếu ta chạy mã này, ta sẽ nhận được kết quả như sau:
Outputocean/wave.txt
from pathlib import Path
làm cho lớp Path
có sẵn cho chương trình của ta . Sau đó, Path("ocean", "wave.txt")
khởi tạo một cá thể Path
mới. Việc in kết quả cho thấy Python đã thêm dấu phân tách hệ điều hành thích hợp giữa /
giữa hai thành phần đường dẫn mà ta đã cung cấp cho nó: "ocean"
và "wave.txt"
.
Lưu ý: Tùy thuộc vào hệ điều hành của bạn, kết quả của bạn có thể hơi khác so với kết quả ví dụ được hiển thị trong hướng dẫn này. Ví dụ: nếu bạn đang chạy Windows, kết quả của bạn cho ví dụ đầu tiên này có thể trông giống như ocean\wave.txt
.
Hiện tại, đối tượng Path
được gán cho biến wave
chứa một đường dẫn tương đối . Nói cách khác, ocean/wave.txt
có thể tồn tại ở một số nơi trên hệ thống file của ta . Ví dụ: nó có thể tồn tại trong /Users/ user_1 /ocean/wave.txt
hoặc /Users/ user_2 /research/ocean/wave.txt
, nhưng ta chưa chỉ định chính xác mà ta đang đề cập đến. Ngược lại, một đường dẫn tuyệt đối đề cập rõ ràng đến một vị trí trên hệ thống file .
Bạn có thể sử dụng Path.home()
để lấy đường dẫn tuyệt đối đến folder chính của user hiện tại:
home = Path.home() wave_absolute = Path(home, "ocean", "wave.txt") print(home) print(wave_absolute)
Nếu ta chạy mã này, ta sẽ nhận được kết quả gần giống như sau:
Output/Users/sammy /Users/sammy/ocean/wave.txt
Lưu ý: Như đã đề cập trước đó, kết quả của bạn sẽ khác nhau tùy thuộc vào hệ điều hành của bạn. Tất nhiên, folder chính của bạn cũng sẽ khác với /Users/ sammy
.
Path.home()
trả về một cá thể Path
với một đường dẫn tuyệt đối đến folder chính của user hiện tại. Sau đó, ta chuyển trong cá thể Path
này và các chuỗi "ocean"
và "wave.txt"
vào một phương thức khởi tạo Path
khác để tạo một đường dẫn tuyệt đối đến file wave.txt
. Kết quả hiển thị dòng đầu tiên là folder chính và dòng thứ hai là folder chính cùng với ocean/wave.txt
.
Ví dụ này cũng minh họa một tính năng quan trọng của lớp Path
: phương thức khởi tạo Path
chấp nhận cả chuỗi và các đối tượng Path
tồn tại từ trước.
Hãy xem xét sự hỗ trợ của cả chuỗi và các đối tượng Path
trong hàm tạo Path
kỹ hơn một chút:
shark = Path(Path.home(), "ocean", "animals", Path("fish", "shark.txt")) print(shark)
Nếu ta chạy mã Python này, ta sẽ nhận được kết quả tương tự như sau:
Output/Users/sammy/ocean/animals/fish/shark.txt
shark
là Path
đến file mà ta đã xây dựng bằng cách sử dụng cả các đối tượng Path
( Path.home()
và Path("fish", "shark.txt")
) và chuỗi ( "ocean"
và "animals"
). Phương thức khởi tạo Path
xử lý thông minh cả hai loại đối tượng và kết hợp chúng một cách rõ ràng bằng cách sử dụng dấu phân tách hệ điều hành thích hợp, trong trường hợp này là /
.
Truy cập thuộc tính file
Bây giờ ta đã học cách tạo các thể hiện Path
, hãy xem lại cách bạn có thể sử dụng các thể hiện đó để truy cập thông tin về file .
Ta có thể sử dụng thuộc tính name
và suffix
để truy cập vào tên file và hậu tố file :
wave = Path("ocean", "wave.txt") print(wave) print(wave.name) print(wave.suffix)
Chạy mã này, ta sẽ nhận được kết quả tương tự như sau:
Output/Users/sammy/ocean/wave.txt wave.txt .txt
Kết quả này cho thấy rằng tên của file ở cuối đường dẫn của ta là wave.txt
và hậu tố của file đó là .txt
.
Path
cũng cung cấp hàm with_name
cho phép bạn tạo liền mạch một đối tượng Path
mới với một tên khác:
wave = Path("ocean", "wave.txt") tides = wave.with_name("tides.txt") print(wave) print(tides)
Nếu ta chạy điều này, ta sẽ nhận được kết quả như sau:
ocean/wave.txt ocean/tides.txt
Đầu tiên, đoạn mã này xây dựng một cá thể Path
trỏ đến một file có tên là wave.txt
. Sau đó, ta gọi phương thức with_name
trên wave
để trả về một cá thể Path
thứ hai trỏ đến một file mới có tên tides.txt
. Phần ocean/
directory của đường dẫn vẫn không thay đổi, để lại đường dẫn cuối cùng là ocean/tides.txt
Truy cập Tổ tiên
Đôi khi, việc truy cập các folder có chứa một đường dẫn đã cho sẽ rất hữu ích. Hãy xem xét một ví dụ:
shark = Path("ocean", "animals", "fish", "shark.txt") print(shark) print(shark.parent)
Nếu ta chạy mã này, ta sẽ nhận được kết quả giống như sau:
Outputocean/animals/fish/shark.txt ocean/animals/fish
Thuộc tính parent
trên một cá thể Path
trả về tổ tiên gần nhất của một đường dẫn file nhất định. Trong trường hợp này, nó trả về folder chứa file shark.txt
: ocean/animals/fish
shark.txt
ocean/animals/fish
.
Ta có thể truy cập thuộc tính parent
nhiều lần liên tiếp để duyệt qua cây tổ tiên của một file nhất định:
shark = Path("ocean", "animals", "fish", "shark.txt") print(shark) print(shark.parent.parent)
Nếu ta chạy mã này, ta sẽ nhận được kết quả sau:
Outputocean/animals/fish/shark.txt ocean/animals
Đầu ra tương tự như kết quả trước đó, nhưng bây giờ ta đã vượt qua một cấp độ khác cao hơn bằng cách truy cập .parent
lần thứ hai. Hai folder lên từ shark.txt
là folder ocean/animals
.
Sử dụng Glob để liệt kê file
Cũng có thể sử dụng lớp Path
để liệt kê các file bằng phương thức glob
.
Giả sử ta có một cấu trúc folder giống như sau:
└── ocean ├── animals │ └── fish │ └── shark.txt ├── tides.txt └── wave.txt
Thư mục ocean
chứa các file tides.txt
và wave.txt
. Ta có một file tên là shark.txt
lồng trong folder ocean
, folder animals
và folder fish
: ocean/animals/fish
.
Để liệt kê tất cả các .txt
trong folder ocean
, ta có thể nói:
for txt_path in Path("ocean").glob("*.txt"): print(txt_path)
Mã này sẽ mang lại kết quả kết quả như:
Outputocean/wave.txt ocean/tides.txt
Các "*.txt"
mẫu glob tìm tất cả các file có đuôi .txt
. Vì mẫu mã thực thi hình cầu đó trong folder ocean
, nó trả về hai .txt
trong folder ocean
: wave.txt
và tides.txt
.
Lưu ý: Nếu bạn muốn sao chép các kết quả kết quả được hiển thị trong ví dụ này, bạn cần bắt chước cấu trúc folder được minh họa ở đây trên máy tính của bạn.
Ta cũng có thể sử dụng phương thức glob
cách đệ quy. Để liệt kê tất cả các .txt
trong folder ocean
và tất cả các folder con của nó, ta có thể nói:
for txt_path in Path("ocean").glob("**/*.txt"): print(txt_path)
Nếu ta chạy mã này, ta sẽ nhận được kết quả như sau:
Outputocean/wave.txt ocean/tides.txt ocean/animals/fish/shark.txt
Phần **
của mẫu hình cầu sẽ trùng với folder này và tất cả các folder bên dưới nó, một cách đệ quy. Vì vậy, ta không chỉ có các wave.txt
và tides.txt
trong kết quả , mà ta còn nhận được file shark.txt
được lồng dưới ocean/animals/fish
.
Tính toán đường dẫn tương đối
Ta có thể sử dụng phương thức Path.relative_to
để tính toán các đường dẫn liên quan đến nhau. Phương thức relative_to
hữu ích, ví dụ, khi bạn muốn truy xuất một phần của đường dẫn file dài.
Hãy xem xét đoạn mã sau:
shark = Path("ocean", "animals", "fish", "shark.txt") below_ocean = shark.relative_to(Path("ocean")) below_animals = shark.relative_to(Path("ocean", "animals")) print(shark) print(below_ocean) print(below_animals)
Nếu ta chạy điều này, ta sẽ nhận được kết quả như sau:
Outputocean/animals/fish/shark.txt animals/fish/shark.txt fish/shark.txt
Các relative_to
phương thức trả về một mới Path
đối tượng liên quan đến các tranh luận nhất định. Trong ví dụ của ta , ta tính toán Path
đến shark.txt
liên quan đến folder ocean
và sau đó liên quan đến cả folder ocean
và animals
.
Nếu relative_to
không thể tính toán một câu trả lời bởi vì ta cung cấp cho nó một con đường không liên quan, nó sẽ gây nên ValueError
:
shark = Path("ocean", "animals", "fish", "shark.txt") shark.relative_to(Path("unrelated", "path"))
Ta sẽ nhận được một ngoại lệ ValueError
được tạo ra từ mã này sẽ giống như sau:
OutputTraceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/Python3.8/pathlib.py", line 899, in relative_to raise ValueError("{!r} does not start with {!r}" ValueError: 'ocean/animals/fish/shark.txt' does not start with 'unrelated/path'
unrelated/path
không phải là một phần của văn bản ocean/animals/fish/shark.txt
, vì vậy không có cách nào để Python tính toán đường dẫn tương đối cho ta .
Kết luận
Mô-đun pathlib
là một phần mạnh mẽ của Thư viện chuẩn Python cho phép ta thao tác nhanh chóng với các đường dẫn hệ thống file trên bất kỳ hệ điều hành nào. Trong hướng dẫn này, ta đã học cách sử dụng một số tiện ích chính của pathlib
để truy cập các thuộc tính file , liệt kê file với các mẫu hình cầu và duyệt qua các file và folder mẹ.
Mô-đun pathlib
hiển thị các lớp và tiện ích bổ sung mà ta chưa đề cập trong hướng dẫn này. Đến đây bạn đã có đường cơ sở, bạn có thể sử dụng tài liệu của module pathlib
để tìm hiểu thêm về các lớp và tiện ích có sẵn khác.
Nếu bạn quan tâm đến việc sử dụng các thư viện Python khác, hãy xem các hướng dẫn sau:
- Cách sử dụng Mô-đun bộ sưu tập trong Python 3
- Cách sử dụng module sqlite3 trong Python 3
- Cách sử dụng ThreadPoolExecutor trong Python 3
Các tin liên quan
Cách tạo Slackbot bằng Python trên Ubuntu 20.042020-06-30
Cách sử dụng ThreadPoolExecutor trong Python 3
2020-06-23
Cách sử dụng module sqlite3 trong Python 3
2020-06-02
Cách thiết lập notebook Jupyter với Python 3 trên Ubuntu 20.04 và Kết nối qua Đường hầm SSH
2020-05-19
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 20.04 [Khởi động nhanh]
2020-05-19
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 20.04
2020-05-06
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 20.04
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 18.04
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên Ubuntu 20.04 [Quickstart]
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên Ubuntu 18.04 [Quickstart]
2020-04-24