HomeLập trìnhPythonĐường dẫn Python...

Đường dẫn Python – Cách sử dụng Mô-đun Pathlib với các ví dụ


[*]

Mỗi hệ điều hành có các quy tắc khác nhau để xây dựng đường dẫn tệp. Ví dụ: Linux sử dụng dấu gạch chéo lên cho đường dẫn, trong khi Windows sử dụng dấu gạch chéo ngược.

Sự khác biệt nhỏ này có thể gây ra sự cố nếu bạn đang thực hiện một dự án và bạn muốn các nhà phát triển khác đến từ các hệ điều hành khác nhau mở rộng mã của bạn.

May mắn thay, nếu bạn đang viết mã bằng Python, mô-đun Pathlib sẽ thực hiện công việc nặng nhọc bằng cách cho phép bạn đảm bảo rằng các đường dẫn tệp của bạn hoạt động giống nhau trong các hệ điều hành khác nhau. Ngoài ra, nó cung cấp các chức năng và hoạt động để giúp bạn tiết kiệm thời gian trong khi xử lý và thao tác với các đường dẫn.

điều kiện tiên quyết

Pathlib là mặc định với Python >= 3.4. Tuy nhiên, nếu bạn đang sử dụng phiên bản Python thấp hơn 3.4, bạn sẽ không có quyền truy cập vào mô-đun này.

Pathlib hoạt động như thế nào?

Để hiểu cách bạn có thể xây dựng một đường dẫn cơ bản bằng Pathlib, hãy tạo một tệp Python mới có tên example.py và đặt nó bên trong một thư mục cụ thể.

Mở tệp và nhập nội dung sau:

import pathlib

p = pathlib.Path(__file__)
print(p)
ví dụ.py

Trong ví dụ này, chúng tôi nhập mô-đun Pathlib. Sau đó, chúng ta tạo một biến mới gọi là p để lưu trữ đường dẫn. Ở đây, chúng tôi sử dụng đối tượng Đường dẫn từ Pathlib với một biến tích hợp trong Python được gọi là __tập tin__ để chỉ đường dẫn tệp chúng tôi hiện đang viết trong đó example.py.

nếu chúng ta in pchúng ta sẽ nhận được đường dẫn đến tệp chúng ta hiện đang ở:

/home/rochdikhalid/dev/src/package/example.py

Như được hiển thị ở trên, Pathlib tạo đường dẫn đến tệp này bằng cách đặt tập lệnh cụ thể này vào đối tượng Đường dẫn. Pathlib chứa nhiều đối tượng như PosixPath()PurePath()mà chúng ta sẽ tìm hiểu thêm trong các phần sau.

Trước khi chúng ta chuyển sang phần này, Pathlib chia các đường dẫn hệ thống tệp thành hai lớp khác nhau đại diện cho hai loại đối tượng đường dẫn: Con đường thanh tịnhCon đường bê tông.

sơ đồ đường dẫn
các lớp PurePath()

Đường dẫn thuần túy cung cấp các tiện ích để xử lý và thao tác trên đường dẫn tệp của bạn mà không cần thực hiện các thao tác ghi, trong khi đường dẫn cụ thể cho phép bạn thao tác và thực hiện các thao tác ghi trên đường dẫn tệp của mình.

Nói cách khác, một con đường cụ thể là một lớp con của một con đường thuần khiết. Nó kế thừa các thao tác từ lớp cha và thêm các thao tác vào/ra để thực hiện lời gọi hệ thống.

Đường dẫn thuần túy trong Python

Đường dẫn thuần túy thao tác đường dẫn tệp trên máy của bạn ngay cả khi nó thuộc hệ điều hành khác.

Ví dụ: giả sử bạn đang dùng Linux và bạn muốn sử dụng đường dẫn tệp Windows. Ở đây, các đối tượng lớp Đường dẫn thuần túy sẽ giúp bạn có được đường dẫn hoạt động trên máy của mình bằng một số thao tác cơ bản như tạo đường dẫn con hoặc truy cập các phần riêng lẻ của đường dẫn.

Nhưng các đường dẫn thuần túy sẽ không thể bắt chước một số hoạt động khác như tạo thư mục hoặc tệp vì bạn không thực sự ở trong hệ điều hành đó.

Cách sử dụng đường dẫn thuần túy

Như bạn có thể thấy trong sơ đồ trên, các đường dẫn thuần túy bao gồm ba lớp xử lý bất kỳ đường dẫn hệ thống tệp nào trên máy của bạn:

PurePath() là nút gốc cung cấp các hoạt động xử lý cho mọi đối tượng đường dẫn trong Pathlib.

Khi bạn khởi tạo PurePath()nó tạo ra hai lớp để xử lý các đường dẫn Windows và các đường dẫn không phải Windows. PurePath() tạo một đối tượng đường dẫn chung “đường dẫn bất khả tri”, bất kể bạn đang chạy trên hệ điều hành nào.

In [*]: pathlib.PurePath('setup.py')                                            
Out[*]: PurePosixPath('setup.py')

PurePath() trong ví dụ trên tạo ra một PurePosixPath() bởi vì chúng tôi cho rằng chúng tôi đang chạy trên máy Linux. Nhưng nếu bạn khởi tạo nó trên Windows, bạn sẽ nhận được một cái gì đó như PureWindowsPath('setup.py').

PurePosixPath() là nút con của PurePath() được triển khai cho các đường dẫn hệ thống tệp không phải của Windows.

In [*]: pathlib.PurePosixPath('setup.py')                                            
Out[*]: PurePosixPath('setup.py')

Bạn sẽ không nhận được bất kỳ lỗi nào nếu bạn khởi tạo PurePosixPath() trên Windows vì quá đơn giản lớp này không thực hiện lời gọi hệ thống.

Đọc thêm  Toán tử Python – Toán tử logic trong Python

PureWindowsPath() là nút con của PurePath() được triển khai cho các đường dẫn hệ thống tệp Windows.

In [*]: pathlib.PureWindowsPath('setup.py')                                     
Out[*]: PureWindowsPath('setup.py')

Ứng dụng tương tự PureWindowsPath() vì lớp này không cung cấp lời gọi hệ thống nên việc khởi tạo nó sẽ không gây ra bất kỳ lỗi nào cho các hệ điều hành khác.

Thuộc tính đường dẫn thuần túy

Mỗi phân lớp trong PurePath() cung cấp các thuộc tính sau:

PurePath().parent xuất ra cha mẹ của đường dẫn:

In [*]: pathlib.PurePath('/src/goo/scripts/main.py').parent                     
Out[*]: PurePosixPath('/src/goo/scripts')

Trong ví dụ trên, chúng tôi đang sử dụng .parent thuộc tính để có được đường dẫn của cha mẹ logic của main.py.

PurePath().parents[] xuất ra tổ tiên của đường dẫn:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main.py')
		p.parents[0]               
Out[*]: PurePosixPath('/src/goo/scripts')

In [*]: p.parents[1]                
Out[*]: PurePosixPath('/src/goo')

Bạn phải luôn chỉ định chỉ mục tổ tiên trong dấu ngoặc vuông như đã thấy ở trên. Trong Python 3.10 trở lên, bạn có thể sử dụng các lát cắt và giá trị chỉ số âm.

PurePath().name cung cấp tên của thành phần cuối cùng trong đường dẫn của bạn:

In [*]: pathlib.PurePath('/src/goo/scripts/main.py').name                      
Out[*]: 'main.py'

Trong ví dụ này, thành phần đường dẫn cuối cùng là main.py. Nên .name thuộc tính xuất tên của tệp main.py đó là chủ yếu với hậu tố của nó .py.

Mặt khác, PurePath().hậu tố cung cấp phần mở rộng tệp của thành phần cuối cùng trong đường dẫn của bạn:

In [*]: pathlib.PurePath('/src/goo/scripts/main.py').suffix                    
Out[*]: '.py'

So với .name tài sản, các .suffix thuộc tính xuất phần mở rộng tệp và loại trừ tên tệp.

PurePath().stem chỉ xuất tên của thành phần cuối cùng trong đường dẫn của bạn mà không có hậu tố:

In [*]: pathlib.PurePath('/src/goo/scripts/main.py').stem                      
Out[*]: 'main'

Như đã thấy ở trên, các .stem thuộc tính không bao gồm hậu tố của thành phần cuối cùng main.py và chỉ cung cấp tên của tệp.

Phương pháp đường dẫn thuần túy

Mỗi lớp con của PurePath() cung cấp các phương pháp sau:

PurePath().is_absolute() kiểm tra xem đường dẫn của bạn có tuyệt đối hay không:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main.py')
        p.is_absolute()

Out[*]: True

In [*]: o = pathlib.PurePath('scripts/main.py')
        o.is_absolute()

Out[*]: False

Lưu ý rằng đường dẫn tuyệt đối bao gồm tên gốc và tên ổ đĩa. Trong trường hợp này, PurePath() không cho phép chúng tôi biết tên của ổ đĩa.

Nếu bạn dùng PureWindowsPath()bạn có thể biểu thị một đường dẫn tuyệt đối chứa tên ổ đĩa như PureWindowsPath('c:/Program Files').

PurePath().is_relative() kiểm tra xem đường dẫn có thuộc về đường dẫn đã cho khác hay không:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main.py')
        p.is_relative_to('/src')

Out[*]: True

In [*]: p.is_relative_to('/data')

Out[*]: False

Trong ví dụ này, đường dẫn đã cho /src là một phần của hoặc thuộc về con đường ptrong khi đường dẫn đã cho khác /data tăng False bởi vì nó không có mối quan hệ tương đối với con đường p.

PurePath().joinpath() nối đường dẫn với các đối số đã cho (đường dẫn con):

In [*]: p = pathlib.PurePath('/src/goo')
        p.joinpath('scripts', 'main.py')

Out[*]: PurePosixPath('/src/goo/scripts/main.py')

Lưu ý rằng không cần thêm dấu gạch chéo vào các đối số đã cho, vì .joinpath() phương pháp xử lý này cho bạn.

PurePath().match() kiểm tra xem đường dẫn có khớp với một mẫu nhất định hay không:

In [*]: pathlib.PurePath('/src/goo/scripts/main.py').match('*.py')
Out[*]: True

In [*]: pathlib.PurePath('/src/goo/scripts/main.py').match('goo/*.py')
Out[*]: True

In [*]: pathlib.PurePath('src/goo/scripts/main.py').match('/*.py')
Out[*]: False

Dựa trên các ví dụ trên, mẫu phải khớp với đường dẫn. Nếu mẫu đã cho là tuyệt đối, thì đường dẫn cũng phải tuyệt đối.

PurePath().with_name() thay đổi tên của thành phần cuối cùng với hậu tố của nó:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main.py')
        p.with_name('app.js')
Out[*]: PurePosixPath('/src/goo/scripts/app.js')

In [*]: p
Out[*]: PurePosixPath('/src/goo/scripts/main.py')

Các .with_name() phương pháp không thay đổi vĩnh viễn tên của thành phần cuối cùng. Ngoài ra, nếu đường dẫn đã cho không chứa tên, sẽ xảy ra lỗi như được đề cập trong tài liệu chính thức.

PurePath().with_stem() chỉ thay đổi tên của thành phần cuối cùng của đường dẫn:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main.py')
        p.with_stem('app.py')
Out[*]: PurePosixPath('/src/goo/scripts/app.py')

In [*]: p
Out[*]: PurePosixPath('/src/goo/scripts/main.py')

Điều này tương tự như .with_name() phương pháp. Các .with_stem() tạm thời thay đổi tên của thành phần cuối cùng. Ngoài ra, nếu đường dẫn đã cho không chứa tên, sẽ xảy ra lỗi.

Đọc thêm  Cách sử dụng Elaticsearch, Logstash và Kibana để trực quan hóa nhật ký trong Python trong thời gian thực

PurePath().with_suffix() tạm thời thay đổi hậu tố hoặc phần mở rộng của thành phần cuối cùng trong đường dẫn của bạn:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main.py')
        p.with_suffix('.js')
Out[*]: PurePosixPath('/src/goo/scripts/main.js')

Nếu tên của đường dẫn đã cho không chứa hậu tố, .with_suffix() phương thức thêm hậu tố cho bạn:

In [*]: p = pathlib.PurePath('/src/goo/scripts/main')
        p.with_suffix('.py')
Out[*]: PurePosixPath('/src/goo/scripts/main.py')

Tuy nhiên, nếu chúng tôi không bao gồm hậu tố và chúng tôi để trống đối số ''hậu tố hiện tại sẽ bị xóa.

In [*]: p = pathlib.PurePath('/src/goo/scripts/main')
        p.with_suffix('')
Out[*]: PurePosixPath('/src/goo/scripts/main')

Một số phương pháp như .with_stem().is_relative_to() đã được thêm gần đây vào Python 3.9 trở lên. Vì vậy, nếu bạn gọi các phương thức này bằng Python 3.8 trở xuống, lỗi thuộc tính sẽ xuất hiện.

Đường dẫn bê tông trong Python

Đường dẫn cụ thể cho phép bạn xử lý, thao tác và thực hiện các thao tác ghi trên các đường dẫn hệ thống tệp khác nhau.

Nói cách khác, loại đối tượng đường dẫn này giúp bạn tạo ví dụ như một tệp mới, một thư mục mới và thực hiện các thao tác nhập/xuất khác khi không ở trong hệ điều hành đó.

Cách sử dụng đường bê tông

Đường dẫn cụ thể xử lý bất kỳ đường dẫn hệ thống tệp nào và thực hiện cuộc gọi hệ thống trên máy của bạn. Các đối tượng đường dẫn đó là các đường dẫn con của các đường dẫn thuần túy và bao gồm ba lớp con giống như các đối tượng thuần túy:

Con đường() là nút con của PurePath()nó cung cấp các thao tác xử lý với khả năng thực hiện các thao tác viết trên đường dẫn của bạn.

Khi bạn khởi tạo Path(), nó tạo ra hai lớp để xử lý các đường dẫn Windows và các đường dẫn không phải Windows. Thích PurePath(), Path() cũng tạo ra một đối tượng đường dẫn chung “đường dẫn bất khả tri”, bất kể bạn đang chạy trên hệ điều hành nào.

In [*]: pathlib.Path('setup.py')                                            
Out[*]: PosixPath('setup.py')

Path() trong ví dụ trên tạo ra một PosixPath() bởi vì chúng tôi cho rằng chúng tôi đang chạy trên máy Linux. Nhưng nếu bạn khởi tạo nó trên Windows, bạn sẽ nhận được một cái gì đó như WindowsPath('setup.py')

PosixPath() là nút con của Path()PurePosixPath()được triển khai để xử lý và thao tác các đường dẫn hệ thống tệp không phải của Windows.

In [*]: pathlib.PosixPath('setup.py')                                            
Out[*]: PosixPath('setup.py')

Bạn sẽ gặp lỗi nếu khởi tạo PosixPath() trên máy Windows vì bạn không thể thực hiện cuộc gọi hệ thống khi đang chạy trên một hệ điều hành khác.

WindowsPath() là nút con của Path()PureWindowsPath() được triển khai cho các đường dẫn hệ thống tệp Windows.

In [*]: pathlib.WindowsPath('setup.py')                                     
Out[*]: WindowsPath('setup.py')

Ứng dụng tương tự WindowsPath() vì bạn đang chạy trên một hệ điều hành khác – nên việc khởi tạo nó sẽ gây ra lỗi.

Thuộc tính của đường dẫn bê tông

Vì đường dẫn cụ thể là lớp con của đường dẫn thuần túy, bạn có thể làm mọi thứ với đường dẫn cụ thể bằng cách sử dụng PurePath() tính chất. Điều này có nghĩa là chúng ta có thể sử dụng, ví dụ, .with_suffix tài sản để thêm một hậu tố vào một đường dẫn cụ thể:

In [*]: p = pathlib.Path('/src/goo/scripts/main')
        p.with_suffix('.py')
Out[*]: PosixPath('/src/goo/scripts/main.py')

Hoặc, bạn có thể kiểm tra xem một đường dẫn đã cho có liên quan đến đường dẫn ban đầu hay không:

In [*]: p = pathlib.Path('/src/goo/scripts/main.py')
        p.is_relative_to('/src')

Out[*]: True

Luôn nhớ rằng các đường dẫn cụ thể kế thừa các thao tác xử lý từ các đường dẫn thuần túy và thêm các thao tác ghi để thực hiện các cuộc gọi hệ thống và cấu hình đầu vào/đầu ra.

Phương pháp đường bê tông

Mỗi lớp con của Path() cung cấp các phương thức sau để xử lý các đường dẫn và thực hiện các cuộc gọi hệ thống:

Đường dẫn().iterdir() trả về nội dung của một thư mục. Giả sử chúng ta có thư mục sau chứa các tệp sau:

data
	population.json
	density.json
	temperature.yml
	stats.md
	details.txt
thư mục dữ liệu

Để trả về nội dung của /data thư mục, bạn có thể sử dụng .iterdir() phương pháp ở đây:

In [*]: p = pathlib.Path('/data')

        for child in p.iterdir():
        	print(child)

Out[*]: PosixPath('/data/population.json')
         PosixPath('/data/density.json')
         PosixPath('/data/temprature.yml')
         PosixPath('/data/stats.md')
         PosixPath('/data/details.txt')

Các .iterdir() phương thức tạo một trình vòng lặp liệt kê các tệp một cách ngẫu nhiên.

Đọc thêm  Vòng lặp While trong Python – Ví dụ về câu lệnh Vòng lặp While True

Đường dẫn().exists() kiểm tra xem tệp/thư mục có tồn tại trong đường dẫn hiện tại không. Hãy sử dụng thư mục của ví dụ trước (thư mục hiện tại của chúng ta là /data):

In [*]: p = pathlib.Path('density.json').exists()
        p
Out[*]: True

Các .exists() phương thức trả về True bởi vì tệp đã cho tồn tại trong data danh mục. Phương thức trả về False nếu tập tin không tồn tại.

In [*]: p = pathlib.Path('aliens.py').exists()
        p
Out[*]: False

Điều tương tự cũng áp dụng cho các thư mục, phương thức trả về True nếu thư mục đã cho tồn tại và trả về False Nếu nó không.

Đường dẫn().mkdir() tạo một thư mục mới tại một đường dẫn nhất định:

In [*]: p = pathlib.Path('data')
        directory = pathlib.Path('data/secrets')
        directory.exists()
Out[*]: False

In [*]: directory.mkdir(parents = False, exist_ok = False)
        directory.exists()
Out[*]: True

Theo các tài liệu chính thức, các .mkdir() phương pháp có ba đối số. Chúng tôi sẽ chỉ tập trung vào lúc này parentsexist_ok.

Cả hai đối số được đặt thành False như mặc định. Các parent gây ra lỗi FileNotFound trong trường hợp thiếu cha, trong khi exist_ok làm tăng lỗi FileExists nếu thư mục đã cho đã tồn tại.

Trong ví dụ trên, bạn có thể đặt các đối số thành True để bỏ qua các lỗi được đề cập và cập nhật thư mục.

Chúng tôi cũng có thể tạo một tệp mới tại một đường dẫn nhất định bằng cách sử dụng Path().touch() phương pháp:

In [*]: file = pathlib.Path('data/secrets/secret_one.md')
        file.exists()
Out[*]: False

In [*]: file.touch(exist_ok = False)
        file.exists()
Out[*]: True

Logic tương tự áp dụng cho .touch() phương pháp. Ở đây, exist_ok có thể được thiết lập để True để bỏ qua lỗi FileExists và cập nhật tệp.

Đường dẫn().rename() đổi tên tệp/thư mục tại một đường dẫn nhất định. Hãy lấy một ví dụ bằng cách sử dụng thư mục của chúng tôi /data:

In [*]: p = pathlib.Path('density.json')
        n = pathlib.Path('density_2100.json')
        p.rename(n)
Out[*]: PosixPath('density_2100.json')

Nếu bạn chỉ định một tệp không tồn tại cho phương thức, nó sẽ gây ra lỗi FileNotFound. Điều tương tự cũng áp dụng cho các thư mục.

Đường dẫn().read_text() trả về nội dung của một tệp ở định dạng chuỗi:

In [*]: p = pathlib.Path('info.txt')
        p.read_text()

Out[*]: 'some text added'

Ngoài ra, bạn có thể sử dụng write_text() phương pháp để viết một nội dung trong một tập tin:

In [*]: p = pathlib.Path('file.txt')
        p.write_text('we are building an empire')

Out[*]: 'we are building an empire'

Lưu ý rằng .write_text() đã được thêm vào Python 3.5 và được cập nhật gần đây trong Python 3.10 để có thêm một số tham số.

Lưu ý quan trọng

Bạn có thể tự hỏi tại sao bạn cần sử dụng đường dẫn hệ thống tệp Windows – bởi vì mọi gói phải tương thích với các hệ điều hành khác, không chỉ Windows.

Bạn đúng nếu mục tiêu là tạo ra một đường dẫn bất khả tri cho hệ điều hành. Tuy nhiên, đôi khi chúng tôi không thể thực hiện việc này do một số cài đặt dành riêng cho hệ thống Windows hoặc Posix. Đó là lý do tại sao các đối tượng đó có sẵn để giúp các nhà phát triển giải quyết các trường hợp sử dụng đó.

Một số gói nhắm mục tiêu các vấn đề chỉ có trong hệ sinh thái Windows và Python cung cấp các trường hợp sử dụng đó trong thư viện này.

Tiếp theo là gì?

Hy vọng rằng hướng dẫn này sẽ giúp bạn tìm hiểu cách thức và lý do sử dụng Pathlib cũng như cách nó hữu ích để xử lý và thao tác các đường dẫn hệ thống tệp.

Sẽ thật tuyệt nếu bạn chơi với những gì bạn đã học và biến mọi thứ thành một dự án thực sự. Nếu bạn có bất kỳ câu hỏi nào, vui lòng kết nối và liên hệ với tôi bất kỳ lúc nào trên LinkedIn.

Ngoài ra, bạn có thể xem kênh của tôi trên YouTube nơi tôi chia sẻ video về những gì tôi đang học và xây dựng bằng mã.

Hẹn gặp lại bạn trong phần hướng dẫn tiếp theo và tiếp tục tiến về phía trước!

Người giới thiệu

Có rất nhiều điều để biết. Trong bài đăng trên blog này, tôi đã đề cập đến những điều cơ bản bạn cần để sử dụng Pathlib trong dự án của mình.

Tài liệu chính thức nêu bật nhiều phương thức và thuộc tính hơn mà bạn có thể áp dụng cho đường dẫn hệ thống tệp của mình:

[*]
[*]Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status