Cách tránh đường dẫn mã hóa cứng trong Python

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. đường dẫn. 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

Làm thế nào có thể tránh mã hóa cứng?

Các phương pháp hay nhất để tránh mã hóa cứng trong. .
1] Chuỗi kết nối. .
2] Cài đặt ứng dụng. .
3] Chuỗi nội dung tài nguyên/khu vực. .
4] Duy trì các tệp/lớp không đổi theo yêu cầu. .
5] Thông báo hành động của người dùng. .
6] Sử dụng IoC và DI để giải quyết các phụ thuộc đối tượng. .
7] Tránh ẩn các khối html bằng Css/Js

Đường dẫn được mã hóa cứng là gì?

Mã hóa cứng [cũng là mã hóa cứng hoặc mã hóa cứng] là phương pháp phát triển phần mềm nhúng dữ liệu trực tiếp vào mã nguồn của chương trình hoặc đối tượng thực thi khác, trái ngược với việc lấy dữ liệu từ các nguồn bên ngoài hoặc tạo dữ liệu trong thời gian chạy

Tại sao chúng ta nên tránh mã hóa cứng?

Họ thấy một cách tiết kiệm nhiều thời gian và trong ngắn hạn, họ đúng. Vấn đề là có những chi phí ẩn đối với mã hóa cứng có thể tốn rất nhiều thời gian . Các nhận xét như "không đặt mã vào lớp theo chủ đề" hoặc "sử dụng hệ thống hook" là phổ biến và thể hiện các cảnh báo theo quy định đối với mã hóa cứng.

Mã hóa cứng trong Python là gì?

Nói một cách đơn giản, mã hóa cứng có nghĩa là bạn thêm một số bit dữ liệu nhất định vào tập lệnh của mình, thường theo cách mà bạn không thể thay đổi nó xuống dòng mà không cần . Chẳng hạn, giả sử bạn có một chương trình có thể tạo một vài tệp. . For instance, say you have a program that may generate a few files.

Chủ Đề