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 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 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 18.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 server Ubuntu 20.04
2020-04-24
 

