Tham gia đường dẫn hệ điều hành python chỉ định dấu phân cách

Gần đây khi đang thực hiện một dự án, một đồng nghiệp đã hỏi liệu một người có thể liệt kê nội dung của các ổ đĩa trong Python không. Tất nhiên bạn có thể. Hơn nữa, vì điều này không phức tạp chút nào, nên tôi muốn lấy trường hợp này để minh họa các phương pháp hay nhất chính được đề xuất để làm việc với các đường dẫn trên các ổ đĩa

Bước 1. Làm cách nào để nhập đúng đường dẫn?

Giả sử rằng bạn muốn nhận danh sách một đường dẫn cụ thể một cách chính xác, chúng tôi bắt đầu bằng cách chọn thư mục người dùng trên hệ thống Windows 10, về cơ bản đây là một ví dụ có thể lặp lại

path_dir: str = "C:\Users\sselt\Documents\blog_demo"

Các biến được gán khi thực hiện ngay lập tức gây ra lỗi

SyntaxError: [unicode error] 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

Trình thông dịch không hiểu chuỗi ký tự \U, vì điều này khởi tạo các ký tự Unicode của một chuỗi tương tự. Sự cố này phát sinh do hệ thống Windows sử dụng dấu gạch chéo ngược “\” làm dấu phân cách đường dẫn và Linux sử dụng dấu gạch chéo “/”. Thật không may, vì trình phân tách Windows cũng là trình khởi tạo cho các ký tự đặc biệt đa dạng hoặc thoát trong Unicode, nên rõ ràng là nó gây nhầm lẫn mọi thứ. Giống như chúng tôi không mong đợi bất kỳ sự gắn kết nào sớm trong việc sử dụng dấu tách thập phân ở các quốc gia khác nhau, lựa chọn duy nhất của chúng tôi là sử dụng một trong ba giải pháp

 

Giải pháp 1 – biến thể ghê tởm

Chỉ cần tránh trình phân tách Windows và thay vào đó chỉ viết đường dẫn bằng trình phân tách Linux

path_dir: str = "C:/Users/sselt/Documents/blog_demo"

Sau đó, trình thông dịch nhận ra đường dẫn chính xác, tin rằng đó là một hệ thống Linux để bắt đầu

 

Giải pháp 2 – biến thể thậm chí còn gớm ghiếc hơn

Sử dụng trình tự thoát

path_dir: str = "C:\\Users\sselt\Documents\\blog_demo"

Điều làm tôi khó chịu ngoài việc không thể đọc được điều này là người ta không sử dụng các chuỗi thoát ở mọi tổ hợp dấu phân cách ký tự, chỉ trước chữ “U” và “b”

 

Giải pháp 3 – giải pháp thanh lịch

Sử dụng các chuỗi thô với “r” làm tiền tố để chỉ ra rằng không nên đánh giá các ký tự đặc biệt

path_dir: str = r"C:\Users\sselt\Documents\blog_demo"

 

Bước 2. Quét các tập tin

Quay lại nhiệm vụ muốn liệt kê tất cả các phần tử trong một thư mục. Chúng ta đã biết con đường

Lệnh đơn giản os. listdir liệt kê tất cả các chuỗi, tôi. e. , chỉ tên tệp đường dẫn. Ở đây và trong tất cả các ví dụ khác, tôi sử dụng gợi ý kiểu cho tài liệu mã bổ sung. Cú pháp này đã có sẵn từ Python 3. 5 trở đi

import os

from typing import List

path_dir: str = r"C:\Users\sselt\Documents\blog_demo"

content_dir: List[str] = os.listdir[path_dir]

Tệp này ổn, nhưng tôi quan tâm hơn đến số liệu thống kê tệp mà chúng tôi có hệ điều hành. thống kê

 

Bước 3. đường dẫn

Để chuyển đường dẫn tệp, trước tiên chúng ta phải kết hợp tên tệp và đường dẫn. Tôi thường thấy các cấu trúc sau trong tự nhiên và thậm chí đã sử dụng chúng khi bắt đầu. Ví dụ

path_file: str = path_dir + "/" + filename                         
path_file: str = path_dir + "\\" + filename                         
path_file: str = "{}/{}".format[path_dir, filename]                         
path_file: str = f"{path_dir}/{filename}"

A và B thật gớm ghiếc, vì chúng nối các chuỗi bằng dấu “+” – không cần thiết trong Python

B đặc biệt ghê tởm, bởi vì người ta cần một dấu phân cách kép trong Windows, nếu không nó sẽ được đánh giá là một chuỗi thoát cho dấu ngoặc kép đóng.  

C và D có phần tốt hơn vì chúng sử dụng định dạng chuỗi, nhưng chúng vẫn không giải quyết được vấn đề phụ thuộc vào hệ thống. Nếu tôi áp dụng kết quả trong Windows, tôi sẽ nhận được một đường dẫn chức năng nhưng không nhất quán với hỗn hợp các dấu phân cách

filename = "some_file"

print["{}/{}".format[path_dir, filename]]

...: 'C:\\Users\\sselt\\Documents\\blog_demo/some_file'

 

Một giải pháp độc lập với hệ điều hành

Một giải pháp từ Python là os. tháng chín hoặc hệ điều hành. đường dẫn. tháng chín. Cả hai đều trả về dấu tách đường dẫn của hệ thống tương ứng. Chúng giống hệt nhau về mặt chức năng, nhưng cú pháp thứ hai, rõ ràng hơn ngay lập tức cho thấy dấu phân cách có liên quan

Điều này có nghĩa là, người ta có thể viết

________số 8_______

Kết quả sẽ tốt hơn, nhưng phải trả giá bằng mã phức tạp, nếu bạn kết hợp nhiều đoạn đường dẫn

Do đó, quy ước là kết hợp các phần tử đường dẫn thông qua nối chuỗi. Điều này thậm chí còn ngắn hơn và chung chung hơn

path_file = os.sep.join[[path_dir, filename]]

 

Lần chạy đầy đủ đầu tiên

Hãy đi đến thư mục

SyntaxError: [unicode error] 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
0
SyntaxError: [unicode error] 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
1

Một trong các kết quả [không hiển thị] là st_atime, lần truy cập cuối cùng, st_mtime cho lần sửa đổi cuối cùng và st_ctime cho thời gian tạo. Ngoài ra, st_size cung cấp kích thước tệp theo byte. Hiện tại, tất cả những gì tôi muốn biết là kích thước và ngày sửa đổi lần cuối, vì vậy tôi chọn lưu một định dạng danh sách đơn giản

SyntaxError: [unicode error] 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
2

 

Chức năng cuối cùng với đệ quy

Kết quả ban đầu có vẻ khả quan, nhưng lại nảy sinh hai vấn đề mới. Listdir không phân biệt giữa các tệp và thư mục, chỉ xử lý cấp độ thư mục và không xử lý các thư mục con. Do đó, chúng ta cần một hàm đệ quy phân biệt giữa tệp và thư mục. hệ điều hành. con đường. isdir kiểm tra xem có thư mục nào bên dưới đường dẫn không

SyntaxError: [unicode error] 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
3

 

Làm cho kết quả trở nên hữu ích dưới dạng khung dữ liệu

Xong. Chúng tôi đã giải quyết vấn đề trong vòng chưa đầy 10 dòng. Vì tôi đã lên kế hoạch khảo sát tệp dưới dạng danh sách các bộ dữ liệu, nên tôi có thể dễ dàng chuyển kết quả vào khung dữ liệu gấu trúc và phân tích nó ở đó để tính toán tổng số được lưu trong các thư mục, v.v.

SyntaxError: [unicode error] 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
4

 

nhưng thật không may, đó không phải là cách thực hành tốt nhất

Tôi biết, blog đã hứa sẽ giải quyết vấn đề bằng các phương pháp hay nhất

Một vài năm trước, các blog của tôi đã đạt được một số danh tiếng, nhưng mặc dù Python vẫn tiếp tục được phát triển nhưng vẫn có thể cải thiện ngay cả những trường hợp sử dụng đơn giản như vậy

Dấu phân cách cho đường dẫn os Python là gì?

Đường dẫn Linux và Windows . Trên hệ điều hành dựa trên Unix như macOS, Linux và BSD, dấu gạch chéo lên [ / ] được sử dụng làm dấu phân cách đường dẫn.

Đường dẫn os Dirname [__ tệp __] trả về là gì?

Loại trả về. Phương thức này trả về một giá trị chuỗi đại diện cho tên thư mục từ đường dẫn đã chỉ định .

__ tệp __ có nghĩa là gì trong Python?

Trong Python a. tệp py là một mô-đun. Vì vậy, nhập amodule sẽ có thuộc tính __file__ có nghĩa là những thứ khác nhau trong các trường hợp khác nhau. Lấy từ các tài liệu. __file__ là tên đường dẫn của tệp mà mô-đun được tải từ đó, nếu nó được tải từ một tệp .

Chủ Đề