Python có đi kèm với Pathlib không?

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
3

pathlib đã đượ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ẫn

Do 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ẫn

os cung cấp

from pathlib import Path
Path.home()
# /Users/adam
3 để tạo đường dẫn tệp

import 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ày

Lấ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
    Path.home()
    # /Users/adam
    01
  • MacOS
    from pathlib import Path
    Path.home()
    # /Users/adam
    02
  • Cửa sổ
    from pathlib import Path
    Path.home()
    # /Users/adam
    03

với hệ điều hành

from pathlib import Path
Path.home()
# /Users/adam
3

Và 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
0

Và với pathlib

from pathlib import Path
Path.home()
# /Users/adam
6

Là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
04

from pathlib import Path
Path.home()
# /Users/adam
8

Vớ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
9

from pathlib import Path
Path.home()
# /Users/adam
1

Thâ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
08

from pathlib import Path
Path.home()
# /Users/adam
4

Vớ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
9

from pathlib import Path
Path.home()
# /Users/adam
7

Hậ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
6

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
0

pathlib 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
9

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
1

Tó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
    Path.home()
    # /Users/adam
    9 duy nhất
  • khó ghi nhớ một số phương thức os (chẳng hạn như
    from pathlib import Path
    Path.home()
    # /Users/adam
    65)

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
1

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
2

Và 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
4

Chú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
68

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
5

Mộ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
6

Chú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ục

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
7

Cá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ôi

Chú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
8

Ghi 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
84

Sử 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ình

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
9

Và 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ình

Mộ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 nhau

from pathlib import Path
path = Path.home() / ‘data’ / ‘file.txt’
# /Users/adam/data/file.txt
9

Nố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 os

Và 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
14

Bâ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
31

Tó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
    Path.home()
    # /Users/adam
    85 trong
    from pathlib import Path
    Path.home()
    # /Users/adam
    16 tránh lỗi khi tạo thư mục đã tồn tại
  • Thuộc tính
    from pathlib import Path
    Path.home()
    # /Users/adam
    17 cho phép dễ dàng truy cập thư mục chứa tệp
  • Ghi dữ liệu vào tệp văn bản với
    from pathlib import Path
    Path.home()
    # /Users/adam
    18

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
32

Và 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ôi

from pathlib import Path
Path.home()
# /Users/adam
33

Tì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ày

Với pathlib,

from pathlib import Path
Path.home()
# /Users/adam
42 là tốt nhất

from pathlib import Path
Path.home()
# /Users/adam
34

from 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
45

Tì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ông

from 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
9

from pathlib import Path
Path.home()
# /Users/adam
36

Tì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
41

Vớ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
73

from pathlib import Path
Path.home()
# /Users/adam
37

Tó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
    Path.home()
    # /Users/adam
    74
  • 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
    Path.home()
    # /Users/adam
    75 hay thư mục có
    from pathlib import Path
    Path.home()
    # /Users/adam
    76 không

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ống

Khô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
39

Và với pathlib

from pathlib import Path
Path.home()
# /Users/adam
0

Bởi vì nhiệm vụ này rất phức tạp nên dưới đây sẽ tóm tắt

table comparing the code to use in os and pathlib

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

Pathlib có trong thư viện chuẩn không?

Mô-đun Pathlib trong Python cung cấp các lớp khác nhau biểu thị các đường dẫn hệ thống tệp với ngữ nghĩa phù hợp với các hệ điều hành khác nhau. Mô-đun này nằm trong các mô-đun tiện ích tiêu chuẩn của Python .

Làm cách nào để sử dụng Pathlib trong Python?

Quảng cáo Python pathlib thay đổi thư mục Chúng tôi vào trong một thư mục khác với os' chdir. #. /usr/bin/python from pathlib import Path from os import chdir path = Path('. ') print(f'Thư mục làm việc hiện tại. {đường dẫn. cwd()}') chdir(path) print(f'Thư mục làm việc hiện tại. {đường dẫn. cwd()}') chdir('. ')

Pathlib có trong Python 2 không?

Trăn 3. 2 trở lên được khuyến nghị, nhưng pathlib cũng có thể sử dụng được với Python 2. 7 và 2. 6 .