Hướng dẫn how to store path in a variable in python - cách lưu trữ đường dẫn trong một biến trong python

Từ thông báo lỗi, rõ ràng chuỗi được lưu trữ ở định dạng chính xác (dấu gạch chéo ngược được thoát ra bằng cách nhân đôi). Vì vậy, có vẻ như đường dẫn là sai, và tập tin thực sự không có.

Mặt khác, trong ví dụ thứ hai của bạn mà bạn đã thêm vào Chỉnh sửa của mình, bạn sử dụng

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
8 - Điều này chắc chắn sẽ thất bại vì
>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
9 là một ký tự tab (trong khi tất cả các kết hợp chữ lùi khác không tồn tại, vì vậy dấu gạch chéo ngược sẽ được xử lý Giống như nó đã thoát ra một cách chính xác). Nhưng bạn nói rằng chuỗi được lưu trữ trong một biến, vì vậy tôi không thấy ví dụ này giúp làm thế nào ở đây.

Xem xét những điều sau:

>>> path = 'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\test5.txt'

Nhìn thấy? Tất cả các dấu gạch chéo ngược được chuyển đổi thành các dấu gạch chéo thoát khỏi

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
9 vì đó là cái duy nhất có ý nghĩa đặc biệt. Và bây giờ, tất nhiên, con đường này là sai. Vì vậy, nếu các biến mà bạn đề cập đã được xác định theo cách này (và bây giờ chứa các đường dẫn không hợp lệ), bạn không thể làm gì ngoại trừ sửa chữa nguồn:

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'

Bạn có thể nghĩ rằng bạn có thể "sửa" một đường dẫn bị lỗi sau đó như thế này:

>>> path = 'c:\example2\media\uploads\test5.txt'
>>> path.replace("\t","\\t")
'c:\\example2\\media\\uploads\\test5.txt'

... Nhưng có nhiều mã thoát khác (

>>> path = 'c:\example2\media\uploads\test5.txt'
>>> path.replace("\t","\\t")
'c:\\example2\\media\\uploads\\test5.txt'
1,
>>> path = 'c:\example2\media\uploads\test5.txt'
>>> path.replace("\t","\\t")
'c:\\example2\\media\\uploads\\test5.txt'
2,
>>> path = 'c:\example2\media\uploads\test5.txt'
>>> path.replace("\t","\\t")
'c:\\example2\\media\\uploads\\test5.txt'
3, v.v.), vì vậy đó không thực sự là một cách khả thi, đặc biệt là vì bạn sẽ tiến hành các triệu chứng thay vì khắc phục vấn đề tiềm ẩn.

Vấn đề: Liệt kê các thư mục và ổ đĩa

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

Bước 1: Làm thế nào để tôi nhập đúng đường dẫn?

Giả sử rằng bạn muốn có được 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 là một ví dụ có thể tái tạo:

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 trình tự ký tự \ u, vì điều này bắt đầu các ký tự Unicode của một chuỗi tương tự. Vấn đề này phát sinh do hệ thống Windows sử dụng dấu gạch chéo ngược \ \ làm một 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ì dấu phân cách Windows cũng là người khởi xướng cho các nhân vật đặc biệt khác nhau hoặc Escape in Unicode, nên rõ ràng 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 các dấu phân cách thập phân ở nhiều quốc gia khác nhau, lựa chọn duy nhất của chúng tôi là đi cho một trong ba giải pháp.

Giải pháp 1 - Biến thể gớm ghiếc

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

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

Trình thông dịch sau đó nhận ra đường dẫn chính xác, tin rằng nó 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 phiền tôi bên cạnh sự bất hợp pháp của điều này là người ta không sử dụng trình tự thoát ở mọi sự kết hợp của người tập hợp nhân vật, chỉ trước khi U U và và Bu Biêu.

Giải pháp 3 - Một cái thanh lịch

Sử dụng các chuỗi RAW với các loại R R R như một tiền tố để chỉ ra rằng các ký tự đặc biệt không nên được đánh giá.

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

Bước 2: Quét các tệp

Quay lại nhiệm vụ của chúng tôi muốn liệt kê tất cả các yếu tố trong một thư mục. Chúng tôi đã biết con đường.

Lệnh đơn giản OS.ListDir liệt kê tất cả các chuỗi, tức là, chỉ có tên tệp đường dẫn. Ở đây và trong tất cả các ví dụ khác, tôi sử dụng loại gợi ý 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 là ổn, nhưng tôi quan tâm nhiều hơn đến số liệu thống kê tệp, mà chúng tôi có OS.stat.

Bước 3: Đường dẫn catenating

Để 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 đây 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 là gớm ghiếc, bởi vì chúng catenate các chuỗi với dấu hiệu++ - không cần thiết trong Python.

B đặc biệt gớm ghiếc, bởi vì người ta cần một thiết bị phân tách kép trong Windows hoặc nó sẽ được đánh giá là một chuỗi thoát cho dấu ngoặc kép đóng. & NBSP;

C và D có phần tốt hơn, vì họ 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.

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
0

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.SEP hoặc OS.Path.Sep. Cả hai trả về bộ tách đường dẫn của hệ thống tương ứng. Chúng có chức năng giống hệt nhau, 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 liên quan.

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

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
1

Kết quả là tốt hơn, nhưng với chi phí của một mã phức tạp, nếu bạn kết hợp một số phân đoạn đường dẫn.

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

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
2

Chạy đầy đủ đầu tiên

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

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
3
>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
4

Một trong những kết quả (không được hiển thị) là st_atime, lần cuối cùng được truy cập, st_mtime cho 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 trong 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 cuối cùng, và vì vậy tôi chọn lưu một định dạng danh sách đơn giản.

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
5

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

Kết quả kết quả có vẻ thỏa đáng lúc đầu, nhưng hai vấn đề mới phát sinh. ListDir không phân biệt giữa các tệp và thư mục, chỉ địa chỉ 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 các tệp và thư mục. os.path.isdir kiểm tra cho chúng tôi xem có thư mục bên dưới đường dẫn hay không.

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
6

Làm cho kết quả hữu ích như một khung dữ liệu

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

>>> path = r'c:\example2\media\uploads\test5.txt'
>>> path
'c:\\example2\\media\\uploads\\test5.txt'
7

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

Tôi biết, blog hứa hẹn sẽ giải quyết vấn đề bằng cách sử dụng các thực tiễn tốt nhất.

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

Trong phần tiếp theo, tôi sẽ giải quyết lại trường hợp sử dụng này và giải quyết nó một cách thanh lịch.

Đọc ở đây phần thứ hai của bài viết trên blog.