Nếu bạn đã lập trình bằng Python được một thời gian, có khả năng bạn đang sử dụng các hàm trong os, chẳng hạn như
from pathlib import Path
Path.home[]
# /Users/adam
3pathlib đã được giới thiệu trong Python 3. 4 và cung cấp một bộ trừu tượng khác để làm việc với các đường dẫn. Tuy nhiên, chỉ vì nó mới hơn, điều đó không có nghĩa là nó tốt hơn
Vậy làm thế nào để quyết định cái nào là tốt nhất?
Vòng một - Đường đơn
Vòng đầu tiên của chúng tôi bao gồm các tác vụ thường được thực hiện với một đường dẫn tệp duy nhất
- hình thành đường dẫn tệp từ chuỗi
- lấy nhà và thư mục làm việc hiện tại
- làm việc với tên tệp và hậu tố
Tạo một đường dẫn tệp duy nhất
Các hệ điều hành thực hiện các cách tiếp cận khác nhau với đường dẫn tệp — ví dụ: LINUX sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
4 trong đó Windows sử dụng from pathlib import Path
Path.home[]
# /Users/adam
5 làm dấu phân cách trong đường dẫnDo sự phức tạp này, tính di động là mối quan tâm chính — cả
from pathlib import Path
Path.home[]
# /Users/adam
6 và pathlib đều cung cấp các cách di động để xây dựng đường dẫnos cung cấp
from pathlib import Path
Path.home[]
# /Users/adam
3 để tạo đường dẫn tệpimport os
path = os.path.join[os.path.expanduser['~'], 'data', 'file.txt']
# /Users/adam/data/file.txt
Trong pathlib, đường dẫn được hình thành bằng cách sử dụng toán tử chia
from pathlib import Path
Path.home[]
# /Users/adam
4 với một đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9 được khởi tạo________số 8Đối tượng
from pathlib import Path
Path.home[]
# /Users/adam
9 là trọng tâm của pathlib. Hầu như tất cả các chức năng chúng ta cần đều có thể được truy cập dưới dạng thuộc tính hoặc phương thức trên đối tượng nàyLấy thư mục chính
Thư mục chính ở những nơi khác nhau trên các hệ điều hành khác nhau. Cả hai đối thủ của chúng tôi đều cung cấp một cách để lấy thư mục chính của người dùng sẽ hoạt động trên cả hệ thống UNIX và Windows
- Ubuntu
from pathlib import Path
01
Path.home[]
# /Users/adam - MacOS
from pathlib import Path
02
Path.home[]
# /Users/adam - Cửa sổ
from pathlib import Path
03
Path.home[]
# /Users/adam
với hệ điều hành
from pathlib import Path
Path.home[]
# /Users/adam
3Và với pathlib
from pathlib import Path
Path.home[]
# /Users/adam
Lấy thư mục làm việc hiện tại
với hệ điều hành
from pathlib import Path
Path.home[]
# /Users/adam
0Và với pathlib
from pathlib import Path
Path.home[]
# /Users/adam
6Làm việc với tên tệp và hậu tố
Tên của một tập tin bao gồm hậu tố
Nhận cái này với os yêu cầu sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
04from pathlib import Path
Path.home[]
# /Users/adam
8Với pathlib, chúng ta có thể sử dụng thuộc tính
from pathlib import Path
Path.home[]
# /Users/adam
05 trên đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9from pathlib import Path
Path.home[]
# /Users/adam
1Thân cây không bao gồm hậu tố. Để có được điều này với os yêu cầu sử dụng cả
from pathlib import Path
Path.home[]
# /Users/adam
04 và from pathlib import Path
Path.home[]
# /Users/adam
08from pathlib import Path
Path.home[]
# /Users/adam
4Với pathlib, chúng ta có thể sử dụng thuộc tính
from pathlib import Path
Path.home[]
# /Users/adam
09 trên đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9from pathlib import Path
Path.home[]
# /Users/adam
7Hậu tố là phần cuối cùng của đường dẫn tệp, thường cho biết loại tệp. Để có được hậu tố với
from pathlib import Path
Path.home[]
# /Users/adam
6from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
0pathlib có
from pathlib import Path
Path.home[]
# /Users/adam
62 như một thuộc tính của đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
1Tóm tắt — đường dẫn đơn
Vòng đầu tiên của chúng tôi đã kết thúc — người chiến thắng là pathlib. Một số điều mà ban giám khảo của chúng tôi thích
- di chuyển dữ liệu và chức năng vào một đối tượng
from pathlib import Path
9 duy nhất
Path.home[]
# /Users/adam - khó ghi nhớ một số phương thức os [chẳng hạn như
from pathlib import Path
65]
Path.home[]
# /Users/adam
Vòng hai - Làm mọi thứ
Vòng thứ hai của chúng tôi bao gồm các nhiệm vụ thường được thực hiện khi tạo ra mọi thứ, bao gồm
- làm thư mục
- lưu dữ liệu vào tệp văn bản
- nối thêm dữ liệu vào tệp văn bản
Làm thư mục
Đầu tiên với
from pathlib import Path
Path.home[]
# /Users/adam
1from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
2Và với pathlib
from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
3Đôi khi chúng tôi muốn tạo một thư mục mới sâu hơn thư mục cuối cùng tồn tại. Thử điều này sẽ gây ra lỗi [vì
from pathlib import Path
Path.home[]
# /Users/adam
67 chưa tồn tại]from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
4Chúng ta có thể tránh điều này bằng cách sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
68from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
5Một nguyên nhân khác gây ra lỗi là cố gắng tạo một thư mục đã tồn tại
from pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
6Chúng tôi thường sử dụng cả
from pathlib import Path
Path.home[]
# /Users/adam
68 và from pathlib import Path
Path.home[]
# /Users/adam
80 bất cứ khi nào chúng tôi tạo một thư mụcfrom pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
7Các ví dụ trên là tất cả về việc tạo một thư mục từ một đường dẫn. Đôi khi chúng ta cũng có một đường dẫn với tên tệp
Đôi khi chúng tôi thực sự có một đường dẫn tệp đầy đủ [bao gồm cả thư mục và tên tệp]. Nếu chúng tôi sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
81 trên đường dẫn tệp đầy đủ, cuối cùng chúng tôi sẽ tạo một thư mục có cùng tên với tệp sắp có của chúng tôiChúng tôi có thể sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
82 để truy cập thư mục kèm theo tệp của chúng tôi và gọi from pathlib import Path
Path.home[]
# /Users/adam
83 trên thư mục đófrom pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
8Ghi dữ liệu vào tệp
Hãy tưởng tượng chúng tôi có một bộ dữ liệu gồm 32 mẫu và chúng tôi muốn lưu từng mẫu vào một tệp trong
from pathlib import Path
Path.home[]
# /Users/adam
84Sử dụng os, nơi chúng tôi thiếu đối số
from pathlib import Path
Path.home[]
# /Users/adam
85 trong from pathlib import Path
Path.home[]
# /Users/adam
86, có nghĩa là chúng tôi cần kiểm tra xem thư mục from pathlib import Path
Path.home[]
# /Users/adam
87 có tồn tại hay không trước khi tạo nóChúng tôi có thể sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
88 để in mẫu đầu tiên của mìnhfrom pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
9Và sau đó sử dụng pathlib, nơi chúng ta có thể sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
80 cùng với phương thức from pathlib import Path
Path.home[]
# /Users/adam
10 trên đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9 của mìnhMột lần nữa sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
88 để in ra mẫu đầu tiên của chúng tôi, do hạt giống ngẫu nhiên của chúng tôi, giống nhaufrom pathlib import Path
path = Path.home[] / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
9Nối thêm dữ liệu vào một tập tin
Nhiệm vụ trên được ghi vào nhiều tệp. một tập tin cho mỗi mẫu. Những lần khác, chúng tôi muốn nối thêm vào một tệp, lợi thế là tất cả dữ liệu của chúng tôi được lưu trữ trong một tệp
Những ví dụ này nối thêm văn bản vào một tệp duy nhất,
from pathlib import Path
Path.home[]
# /Users/adam
13. Đầu tiên với osVà với pathlib - lưu ý ở đây chúng tôi buộc phải sử dụng quản lý ngữ cảnh để có thể chuyển cờ nối thêm của
from pathlib import Path
Path.home[]
# /Users/adam
14Bây giờ dữ liệu của chúng tôi được lưu trữ trong một tệp [một dòng trên mỗi hàng]
from pathlib import Path
Path.home[]
# /Users/adam
31Tóm tắt - làm mọi thứ
Ding ding ding. Người chiến thắng lại là pathlib. Một số điều mà ban giám khảo của chúng tôi thích trong vòng này
- Đối số của
from pathlib import Path
85 trong
Path.home[]
# /Users/adamfrom pathlib import Path
16 tránh lỗi khi tạo thư mục đã tồn tại
Path.home[]
# /Users/adam - Thuộc tính
from pathlib import Path
17 cho phép dễ dàng truy cập thư mục chứa tệp
Path.home[]
# /Users/adam - Ghi dữ liệu vào tệp văn bản với
from pathlib import Path
18
Path.home[]
# /Users/adam
Vòng Ba - Đọc và Tìm
Vòng thứ ba của chúng tôi là làm việc với những thứ đã tồn tại, chẳng hạn như
- đọc tệp văn bản
- tìm tập tin
- tìm thư mục
Đọc từ tệp văn bản
Hãy mở một trong những tệp văn bản mà chúng tôi đã tạo trước đó
Trước tiên, chúng tôi sẽ mở nó bằng os, yêu cầu quản lý ngữ cảnh để đóng tệp đúng cách sau khi mở
from pathlib import Path
Path.home[]
# /Users/adam
32Và sau đó chúng tôi sẽ sử dụng pathlib, nơi có thể mở, đọc và đóng tệp bằng phương thức
from pathlib import Path
Path.home[]
# /Users/adam
19 trên đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9 của chúng tôifrom pathlib import Path
Path.home[]
# /Users/adam
33Tìm nhiều tệp theo cách đệ quy
Đôi khi chúng tôi muốn tìm đường dẫn cho nhiều tệp. Chúng tôi muốn tìm đường dẫn sâu trong hệ thống tệp, tôi. e. , đệ quy
Với os, chúng ta có thể sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
41 để làm điều nàyVới pathlib,
from pathlib import Path
Path.home[]
# /Users/adam
42 là tốt nhấtfrom pathlib import Path
Path.home[]
# /Users/adam
34from pathlib import Path
Path.home[]
# /Users/adam
42 sẽ không trả lại thứ tự đường dẫn một cách xác định. Nếu bạn đang dựa vào đơn đặt hàng, hãy nhớ gọi cho from pathlib import Path
Path.home[]
# /Users/adam
44 trên from pathlib import Path
Path.home[]
# /Users/adam
45Tìm tất cả các thư mục
Thường thì chúng tôi muốn có một danh sách các thư mục tại một đường dẫn nhất định. Ở đây chúng tôi sử dụng thư mục chính của người dùng. Chúng tôi không muốn điều này được đệ quy
Đối với
from pathlib import Path
Path.home[]
# /Users/adam
6, chúng tôi sử dụng from pathlib import Path
Path.home[]
# /Users/adam
47 để lặp qua một đường dẫn, với from pathlib import Path
Path.home[]
# /Users/adam
48 để kiểm tra xem đường dẫn đó có phải là một thư mục khôngfrom pathlib import Path
Path.home[]
# /Users/adam
35Đối với pathlib, chúng tôi sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
49 và from pathlib import Path
Path.home[]
# /Users/adam
70. Cả hai phương thức đều được gọi trên đối tượng from pathlib import Path
Path.home[]
# /Users/adam
9from pathlib import Path
Path.home[]
# /Users/adam
36Tìm tất cả các thư mục theo cách đệ quy
Đôi khi chúng tôi muốn nhìn xa hơn một đường dẫn và tìm kiếm đệ quy các thư mục
Chúng tôi có thể làm điều này bằng cách sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
41Với pathlib, điều này được thực hiện tốt nhất bằng cách sử dụng
from pathlib import Path
Path.home[]
# /Users/adam
73from pathlib import Path
Path.home[]
# /Users/adam
37Tóm tắt - đọc và tìm
Vòng thứ ba của chúng tôi đã kết thúc — người chiến thắng là pathlib. Một số điều mà ban giám khảo của chúng tôi thích
- Đọc từ tệp văn bản với
from pathlib import Path
74
Path.home[]
# /Users/adam - Có thể kiểm tra xem đường dẫn có phải là thư mục bằng cách sử dụng
from pathlib import Path
75 hay thư mục có
Path.home[]
# /Users/adamfrom pathlib import Path
76 không
Path.home[]
# /Users/adam
Vòng cuối cùng - Loại bỏ mọi thứ
Vòng cuối cùng của chúng tôi là về việc loại bỏ mọi thứ
- xóa thư mục
- xóa tập tin
Xóa thư mục
Cách tốt nhất để làm điều này là với
from pathlib import Path
Path.home[]
# /Users/adam
77, nó sẽ xóa thư mục ngay cả khi nó không trốngKhông có sự khác biệt thực sự giữa os và pathlib ngoại trừ khi tạo đường dẫn tệp. Ví dụ dưới đây sử dụng pathlib
from pathlib import Path
Path.home[]
# /Users/adam
38Đây thường là hành vi bạn muốn khi xóa thư mục. xóa ngay cả khi không trống
Xóa tệp
Đôi khi chúng tôi muốn xóa các tệp cụ thể khi chúng tôi biết đường dẫn
Chúng ta có thể làm điều này với os
from pathlib import Path
Path.home[]
# /Users/adam
39Và với pathlib
from pathlib import Path
Path.home[]
# /Users/adam
0Bởi vì nhiệm vụ này rất phức tạp nên dưới đây sẽ tóm tắt
Tóm tắt - xóa mọi thứ
Vòng cuối cùng của chúng ta đã kết thúc — và đó là một trận hòa. Đây là nhiệm vụ cuối cùng và do sự phức tạp của cả hai cách tiếp cận cần sử dụng thư viện bổ sung
from pathlib import Path
Path.home[]
# /Users/adam
78Đó là một kết quả công bằng bởi các giám khảo của chúng tôi - có lẽ với một chút thiện cảm dành cho os, một đối thủ dũng cảm nhưng bị người kế nhiệm vượt trội