Giải quyết đường dẫn trăn

Bạn gặp khó khăn với việc xử lý đường dẫn tệp trong Python? . 4 trở lên, cuộc đấu tranh đã kết thúc. Bạn không còn cần phải vò đầu bứt tai viết mã như

>>>

>>> path.rsplit('\\', maxsplit=1)[0]

Hoặc co rúm người lại trước sự dài dòng của

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))

Trong hướng dẫn này, bạn sẽ thấy cách làm việc với đường dẫn tệp—tên của thư mục và tệp—trong Python. Bạn sẽ tìm hiểu những cách mới để đọc và ghi tệp, thao tác với đường dẫn và hệ thống tệp bên dưới, cũng như xem một số ví dụ về cách liệt kê tệp và lặp lại chúng. Sử dụng mô-đun

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1, hai ví dụ trên có thể được viết lại bằng mã Pythonic thanh lịch, dễ đọc và như

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()

Tải xuống PDF miễn phí. Bảng cheat Python 3

Sự cố với xử lý đường dẫn tệp Python

Làm việc với tệp và tương tác với hệ thống tệp rất quan trọng vì nhiều lý do khác nhau. Các trường hợp đơn giản nhất có thể chỉ liên quan đến việc đọc hoặc ghi tệp, nhưng đôi khi có các tác vụ phức tạp hơn. Có thể bạn cần liệt kê tất cả các tệp trong một thư mục thuộc loại nhất định, tìm thư mục mẹ của một tệp nhất định hoặc tạo một tên tệp duy nhất chưa tồn tại

Theo truyền thống, Python đã biểu diễn các đường dẫn tệp bằng các chuỗi văn bản thông thường. Với sự hỗ trợ từ thư viện chuẩn

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
2, điều này là đủ mặc dù hơi cồng kềnh (như ví dụ thứ hai trong phần giới thiệu cho thấy). Tuy nhiên, vì đường dẫn không phải là chuỗi nên chức năng quan trọng được lan truyền khắp thư viện tiêu chuẩn, bao gồm các thư viện như
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
3,
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
4 và
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
5. Ví dụ sau cần ba câu lệnh
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
6 chỉ để di chuyển tất cả tệp văn bản vào thư mục lưu trữ

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)

Với các đường dẫn được biểu thị bằng các chuỗi, có thể, nhưng thường là một ý tưởng tồi, sử dụng các phương thức chuỗi thông thường. Chẳng hạn, thay vì nối hai đường dẫn với

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
7 như các chuỗi thông thường, bạn nên sử dụng
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
8, nối các đường dẫn bằng dấu tách đường dẫn chính xác trên hệ điều hành. Nhớ lại rằng Windows sử dụng
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
9 trong khi Mac và Linux sử dụng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30 làm dấu phân cách. Sự khác biệt này có thể dẫn đến các lỗi khó phát hiện, chẳng hạn như ví dụ đầu tiên của chúng tôi trong phần giới thiệu chỉ hoạt động với các đường dẫn Windows

Mô-đun

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 đã được giới thiệu trong Python 3. 4 (PEP 428) để đối phó với những thách thức này. Nó tập hợp các chức năng cần thiết ở một nơi và cung cấp chức năng đó thông qua các phương thức và thuộc tính trên một đối tượng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32 dễ sử dụng

Ban đầu, các gói khác vẫn sử dụng chuỗi cho đường dẫn tệp, nhưng kể từ Python 3. 6, mô-đun

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 được hỗ trợ trong toàn bộ thư viện chuẩn, một phần do bổ sung giao thức đường dẫn hệ thống tệp. Nếu bạn gặp khó khăn với Python kế thừa, thì cũng có một backport dành cho Python 2

Thời gian cho hành động. hãy để chúng tôi xem cách

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 hoạt động trong thực tế

Loại bỏ các quảng cáo

Tạo đường dẫn

Tất cả những gì bạn thực sự cần biết là lớp

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
35. Có một số cách khác nhau để tạo đường dẫn. Trước hết, có các phương thức lớp như
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
36 (Thư mục làm việc hiện tại) và
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
37 (thư mục chính của người dùng của bạn)

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
3

Ghi chú. Trong suốt hướng dẫn này, chúng tôi sẽ giả định rằng

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 đã được nhập, không đánh vần
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
39 như trên. Vì bạn sẽ chủ yếu sử dụng lớp
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32, nên bạn cũng có thể làm
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
51 và viết
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32 thay vì
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
35

Một đường dẫn cũng có thể được tạo rõ ràng từ biểu diễn chuỗi của nó

>>>

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
5

Một mẹo nhỏ để xử lý các đường dẫn Windows. trên Windows, dấu phân cách đường dẫn là dấu gạch chéo ngược,

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
9. Tuy nhiên, trong nhiều ngữ cảnh, dấu gạch chéo ngược cũng được sử dụng làm ký tự thoát để thể hiện các ký tự không in được. Để tránh sự cố, hãy sử dụng chuỗi ký tự thô để biểu thị đường dẫn Windows. Đây là những chuỗi ký tự có
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
55 được thêm vào trước chúng. Trong chuỗi ký tự thô,
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
9 đại diện cho dấu gạch chéo ngược theo nghĩa đen.
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
57

Cách thứ ba để xây dựng đường dẫn là nối các phần của đường dẫn bằng toán tử đặc biệt

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30. Toán tử dấu gạch chéo lên được sử dụng độc lập với dấu tách đường dẫn thực tế trên nền tảng

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
4

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30 có thể tham gia một số đường dẫn hoặc kết hợp các đường dẫn và chuỗi (như trên) miễn là có ít nhất một đối tượng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32. Nếu bạn không thích ký hiệu đặc biệt của
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30, bạn có thể làm điều tương tự với phương pháp
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
42

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
9

Lưu ý rằng trong các ví dụ trước,

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
35 được biểu thị bằng
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
44 hoặc
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
45. Đối tượng thực tế đại diện cho đường dẫn phụ thuộc vào hệ điều hành cơ bản. (Tức là, ví dụ
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
44 chạy trên Windows, trong khi ví dụ
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
45 chạy trên Mac hoặc Linux. ) Xem phần Sự khác biệt của Hệ điều hành để biết thêm thông tin

Đọc và ghi tập tin

Theo truyền thống, cách để đọc hoặc ghi một tệp trong Python là sử dụng hàm

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
48 tích hợp sẵn. Điều này vẫn đúng vì hàm
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
48 có thể sử dụng trực tiếp các đối tượng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32. Ví dụ sau tìm tất cả các tiêu đề trong tệp Markdown và in chúng

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
8

Một cách thay thế tương đương là gọi

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
91 trên đối tượng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1

Trên thực tế,

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
93 đang gọi
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
48 tích hợp ở hậu trường. Tùy chọn nào bạn sử dụng chủ yếu là vấn đề sở thích

Để đọc và ghi tệp đơn giản, có một số phương pháp thuận tiện trong thư viện

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1

  • >>> path.parent
    >>> (pathlib.Path.home() / 'realpython.txt').is_file()
    
    96. mở đường dẫn ở chế độ văn bản và trả về nội dung dưới dạng chuỗi
  • >>> path.parent
    >>> (pathlib.Path.home() / 'realpython.txt').is_file()
    
    97. mở đường dẫn ở chế độ nhị phân/byte và trả về nội dung dưới dạng chuỗi ký tự
  • >>> path.parent
    >>> (pathlib.Path.home() / 'realpython.txt').is_file()
    
    98. mở đường dẫn và ghi dữ liệu chuỗi vào nó
  • >>> path.parent
    >>> (pathlib.Path.home() / 'realpython.txt').is_file()
    
    99. mở đường dẫn ở chế độ nhị phân/byte và ghi dữ liệu vào đó

Ví dụ, mỗi phương pháp này xử lý việc mở và đóng tệp, làm cho chúng trở nên đơn giản để sử dụng

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
0

Đường dẫn cũng có thể được chỉ định dưới dạng tên tệp đơn giản, trong trường hợp đó, chúng được diễn giải tương ứng với thư mục làm việc hiện tại. Ví dụ sau tương đương với ví dụ trước

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
1

Phương thức

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
80 sẽ tìm đường dẫn đầy đủ. Dưới đây, chúng tôi xác nhận rằng thư mục làm việc hiện tại được sử dụng cho các tên tệp đơn giản

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
2

Lưu ý rằng khi các đường dẫn được so sánh, chính các biểu diễn của chúng được so sánh. Trong ví dụ trên,

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
81 không bằng
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
82, bởi vì
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
81 được đại diện bởi
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
84 trong khi
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
82 được đại diện bởi
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
86

Loại bỏ các quảng cáo

Chọn ra các thành phần của một đường dẫn

Các phần khác nhau của đường dẫn có sẵn thuận tiện dưới dạng thuộc tính. Các ví dụ cơ bản bao gồm

  • import glob
    import os
    import shutil
    
    for file_name in glob.glob('*.txt'):
        new_path = os.path.join('archive', file_name)
        shutil.move(file_name, new_path)
    
    87. tên tập tin mà không có bất kỳ thư mục
  • import glob
    import os
    import shutil
    
    for file_name in glob.glob('*.txt'):
        new_path = os.path.join('archive', file_name)
        shutil.move(file_name, new_path)
    
    88. thư mục chứa tệp hoặc thư mục mẹ nếu đường dẫn là thư mục
  • import glob
    import os
    import shutil
    
    for file_name in glob.glob('*.txt'):
        new_path = os.path.join('archive', file_name)
        shutil.move(file_name, new_path)
    
    89. tên tệp không có hậu tố
  • import glob
    import os
    import shutil
    
    for file_name in glob.glob('*.txt'):
        new_path = os.path.join('archive', file_name)
        shutil.move(file_name, new_path)
    
    10. phần mở rộng tập tin
  • import glob
    import os
    import shutil
    
    for file_name in glob.glob('*.txt'):
        new_path = os.path.join('archive', file_name)
        shutil.move(file_name, new_path)
    
    11. một phần của đường dẫn trước các thư mục

Đây là những thuộc tính đang hoạt động

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
3

Lưu ý rằng

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
88 trả về một đối tượng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32 mới, trong khi các thuộc tính khác trả về các chuỗi. Ví dụ, điều này có nghĩa là
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
88 có thể được xâu chuỗi như trong ví dụ trước hoặc thậm chí được kết hợp với
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30 để tạo các đường dẫn hoàn toàn mới

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
4

Pathlib Cheatsheet tuyệt vời cung cấp một biểu diễn trực quan về các thuộc tính và phương thức này cũng như các thuộc tính và phương thức khác

Di chuyển và xóa tệp

Thông qua

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1, bạn cũng có quyền truy cập vào các hoạt động cấp hệ thống tệp cơ bản như di chuyển, cập nhật và thậm chí xóa tệp. Phần lớn, các phương pháp này không đưa ra cảnh báo hoặc chờ xác nhận trước khi thông tin hoặc tệp bị mất. Hãy cẩn thận khi sử dụng các phương pháp này

Để di chuyển tệp, hãy sử dụng

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
17. Lưu ý rằng nếu đích đã tồn tại,
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
17 sẽ ghi đè lên nó. Thật không may,
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 không hỗ trợ rõ ràng việc di chuyển tệp an toàn. Để tránh khả năng ghi đè đường dẫn đích, đơn giản nhất là kiểm tra xem đích có tồn tại hay không trước khi thay thế

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
5

Tuy nhiên, điều này sẽ mở ra cơ hội cho một điều kiện cuộc đua có thể xảy ra. Một quy trình khác có thể thêm một tệp tại đường dẫn

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
00 giữa việc thực thi câu lệnh
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
01 và phương thức
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
17. Nếu đó là một mối quan tâm, một cách an toàn hơn là mở đường dẫn đích để tạo độc quyền và sao chép rõ ràng dữ liệu nguồn

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
6

Đoạn mã trên sẽ tăng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
03 nếu đã tồn tại
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
00. Về mặt kỹ thuật, điều này sao chép một tập tin. Để thực hiện di chuyển, chỉ cần xóa
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
05 sau khi sao chép xong (xem bên dưới). Hãy chắc chắn rằng không có ngoại lệ nào được nêu ra

Khi bạn đổi tên tệp, các phương pháp hữu ích có thể là

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
06 và
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
07. Cả hai đều trả về đường dẫn ban đầu nhưng với tên hoặc hậu tố được thay thế tương ứng

Ví dụ

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
7

Thư mục và tệp có thể bị xóa bằng cách sử dụng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
08 và
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
09 tương ứng. (Một lần nữa, hãy cẩn thận. )

ví dụ

Trong phần này, bạn sẽ thấy một số ví dụ về cách sử dụng

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 để đối phó với những thách thức đơn giản

Loại bỏ các quảng cáo

Đếm tập tin

Có một số cách khác nhau để liệt kê nhiều tệp. Đơn giản nhất là phương thức

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
11, nó lặp lại tất cả các tệp trong thư mục đã cho. Ví dụ sau kết hợp lớp
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
11 với lớp
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
13 để đếm xem mỗi loại tệp có bao nhiêu tệp trong thư mục hiện tại

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
8

Danh sách tệp linh hoạt hơn có thể được tạo bằng các phương pháp

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
14 và
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
15 (toàn cầu đệ quy). Chẳng hạn,
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
16 trả về tất cả các tệp có hậu tố
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
17 trong thư mục hiện tại. Phần sau chỉ tính các loại tệp bắt đầu bằng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
18

>>>

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
9

Hiển thị cây thư mục

Ví dụ tiếp theo định nghĩa một hàm,

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
19, sẽ in một cây trực quan biểu thị cấu trúc phân cấp tệp, bắt nguồn từ một thư mục nhất định. Ở đây, chúng tôi cũng muốn liệt kê các thư mục con, vì vậy chúng tôi sử dụng phương thức
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
15

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
0

Lưu ý rằng chúng ta cần biết tệp nằm cách thư mục gốc bao xa. Để làm điều này, trước tiên chúng tôi sử dụng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
21 để biểu thị đường dẫn liên quan đến thư mục gốc. Sau đó, chúng tôi đếm số lượng thư mục (sử dụng thuộc tính
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
22) trong biểu diễn. Khi chạy, chức năng này tạo ra một cây trực quan như sau

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
1

Ghi chú. Chuỗi f chỉ hoạt động trong Python 3. 6 trở lên. Trong Pythons cũ hơn, biểu thức

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
23 có thể được viết là
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
24

Tìm tệp được sửa đổi lần cuối

Các phương thức

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
11,
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
14 và
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
15 rất phù hợp cho các biểu thức trình tạo và hiểu danh sách. Để tìm tệp trong thư mục được sửa đổi lần cuối, bạn có thể sử dụng phương pháp
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
28 để lấy thông tin về các tệp bên dưới. Chẳng hạn,
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
29 đưa ra thời gian sửa đổi lần cuối của tệp

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
2

Bạn thậm chí có thể lấy nội dung của tệp được sửa đổi lần cuối với biểu thức tương tự

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
3

Dấu thời gian được trả về từ các thuộc tính

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30 khác nhau biểu thị số giây kể từ ngày 1 tháng 1 năm 1970. Ngoài
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
31,
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32 hoặc
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
33 có thể được sử dụng để chuyển đổi dấu thời gian thành thứ gì đó hữu dụng hơn

Tạo một tên tệp duy nhất

Ví dụ cuối cùng sẽ chỉ ra cách tạo tên tệp được đánh số duy nhất dựa trên mẫu. Đầu tiên, chỉ định một mẫu cho tên tệp, có chỗ cho bộ đếm. Sau đó, kiểm tra sự tồn tại của đường dẫn tệp được tạo bằng cách nối thư mục và tên tệp (với giá trị cho bộ đếm). Nếu nó đã tồn tại, hãy tăng bộ đếm và thử lại

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
4

Nếu thư mục đã chứa các tệp

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
34 và
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
35, đoạn mã trên sẽ đặt
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
36 thành
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
37

Loại bỏ các quảng cáo

Sự khác biệt của hệ điều hành

Trước đó, chúng tôi đã lưu ý rằng khi chúng tôi khởi tạo

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
35, đối tượng
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
44 hoặc
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
45 đã được trả về. Loại đối tượng sẽ phụ thuộc vào hệ điều hành bạn đang sử dụng. Tính năng này giúp viết mã tương thích đa nền tảng khá dễ dàng. Có thể yêu cầu
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
44 hoặc
>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
45 một cách rõ ràng, nhưng bạn sẽ chỉ giới hạn mã của mình cho hệ thống đó mà không có bất kỳ lợi ích nào. Một đường dẫn cụ thể như thế này không thể được sử dụng trên một hệ thống khác

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
5

Có thể đôi khi bạn cần biểu diễn đường dẫn mà không có quyền truy cập vào hệ thống tệp cơ bản (trong trường hợp đó, cũng có thể biểu thị đường dẫn Windows trên hệ thống không phải Windows hoặc ngược lại). Điều này có thể được thực hiện với các đối tượng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
43. Các đối tượng này hỗ trợ các hoạt động được thảo luận trong phần trên Thành phần đường dẫn nhưng không hỗ trợ các phương thức truy cập hệ thống tệp

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
6

Bạn có thể khởi tạo trực tiếp

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
44 hoặc
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
45 trên tất cả các hệ thống. Khởi tạo
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
43 sẽ trả về một trong các đối tượng này tùy thuộc vào hệ điều hành bạn đang sử dụng

Đường dẫn như các đối tượng thích hợp

Trong phần giới thiệu, chúng tôi đã lưu ý ngắn gọn rằng các đường dẫn không phải là các chuỗi và một động lực đằng sau

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 là biểu thị hệ thống tệp bằng các đối tượng phù hợp. Trên thực tế, tài liệu chính thức của
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 có tiêu đề
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 - Đường dẫn hệ thống tệp hướng đối tượng. Cách tiếp cận Hướng đối tượng đã khá rõ ràng trong các ví dụ trên (đặc biệt nếu bạn đối chiếu nó với cách làm việc cũ của
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
2). Tuy nhiên, hãy để tôi để lại cho bạn một vài mẩu tin nhỏ khác

Không phụ thuộc vào hệ điều hành bạn đang sử dụng, các đường dẫn được thể hiện theo kiểu Posix, với dấu gạch chéo lên làm dấu phân cách đường dẫn. Trên Windows, bạn sẽ thấy một cái gì đó như thế này

>>>

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
5

Tuy nhiên, khi một đường dẫn được chuyển đổi thành một chuỗi, nó sẽ sử dụng dạng gốc, chẳng hạn như với dấu gạch chéo ngược trên Windows

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
8

Điều này đặc biệt hữu ích nếu bạn đang sử dụng một thư viện không biết cách xử lý các đối tượng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
35. Đây là một vấn đề lớn hơn trên các phiên bản Python trước 3. 6. Chẳng hạn, trong Python 3. 5, thư viện chuẩn
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
52 chỉ có thể sử dụng đường dẫn chuỗi để đọc tệp. Cách xử lý các trường hợp như vậy là thực hiện chuyển đổi thành chuỗi một cách rõ ràng

>>>

>>> path.parent
>>> (pathlib.Path.home() / 'realpython.txt').is_file()
9

Trong Python 3. 6 trở lên, nên sử dụng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
53 thay vì
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
54 nếu bạn cần thực hiện chuyển đổi rõ ràng. Điều này an toàn hơn một chút vì nó sẽ gây ra lỗi nếu bạn vô tình cố chuyển đổi một đối tượng không giống đường dẫn

Có thể phần bất thường nhất của thư viện

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 là việc sử dụng toán tử
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30. Để có một cái nhìn thoáng qua, chúng ta hãy xem điều đó được thực hiện như thế nào. Đây là một ví dụ về nạp chồng toán tử. hành vi của một nhà điều hành được thay đổi tùy thuộc vào bối cảnh. Bạn đã thấy điều này trước đây. Hãy nghĩ xem
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
7 có ý nghĩa khác nhau như thế nào đối với chuỗi và số. Python thực hiện quá tải toán tử thông qua việc sử dụng các phương thức gạch dưới kép (a. k. a. phương pháp dunder)

Toán tử

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
30 được định nghĩa theo phương thức
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
59. Trên thực tế, nếu bạn xem mã nguồn của
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1, bạn sẽ thấy nội dung như

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
0

Sự kết luận

Kể từ Python 3. 4,

import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1 đã có sẵn trong thư viện tiêu chuẩn. Với
import glob
import os
import shutil

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)
1, đường dẫn tệp có thể được biểu diễn bằng các đối tượng
>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32 thích hợp thay vì các chuỗi đơn giản như trước đây. Các đối tượng này tạo mã xử lý đường dẫn tệp

  • Dễ đọc hơn, đặc biệt là vì
    >>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
    
    30 được sử dụng để nối các đường dẫn lại với nhau
  • Mạnh mẽ hơn, với hầu hết các phương thức và thuộc tính cần thiết có sẵn trực tiếp trên đối tượng
  • Nhất quán hơn trên các hệ điều hành, vì các đặc thù của các hệ thống khác nhau bị ẩn bởi đối tượng
    >>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
    
    32

Trong hướng dẫn này, bạn đã biết cách tạo đối tượng

>>> os.path.isfile(os.path.join(os.path.expanduser('~'), 'realpython.txt'))
32, đọc và ghi tệp, thao tác với đường dẫn và hệ thống tệp bên dưới, cũng như một số ví dụ về cách lặp qua nhiều đường dẫn tệp

Tải xuống PDF miễn phí. Bảng cheat Python 3

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Sử dụng Mô-đun pathlib của Python

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Giải quyết đường dẫn trăn

Gửi cho tôi thủ thuật Python »

Giới thiệu về Geir Arne Hjelle

Giải quyết đường dẫn trăn
Giải quyết đường dẫn trăn

Geir Arne là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python

» Thông tin thêm về Geir Arne


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Giải quyết đường dẫn trăn

Aldren

Giải quyết đường dẫn trăn

Đan

Giải quyết đường dẫn trăn

Joanna

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Giải quyết đường dẫn trăn

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng các chuyên gia Pythonistas

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi