Thứ tư, 15/07/2020 | 00:00 GMT+7

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ô-đun pathlib để đ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:

Output
ocean/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""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""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

sharkPath đến file mà ta đã xây dựng bằng cách sử dụng cả các đối tượng Path ( Path.home()Path("fish", "shark.txt") ) và chuỗi ( "ocean""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 namesuffix để 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:

Output
ocean/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:

Output
ocean/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.txtwave.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ư:

Output
ocean/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.txttides.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:

Output
ocean/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.txttides.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:

Output
ocean/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 oceananimals .

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:

Output
Traceback (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:


Tags:

Các tin liên quan

Cách tạo Slackbot bằng Python trên Ubuntu 20.04
2020-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