os.path.commonprefix () và os.path.relpath () là bạn của bạn:
>>> print os.path.commonprefix(['/usr/var/log', '/usr/var/security'])
'/usr/var'
>>> print os.path.commonprefix(['/tmp', '/usr/var']) # No common prefix: the root is the common prefix
'/'
Do đó, bạn có thể kiểm tra xem tiền tố chung có phải là một trong các đường dẫn hay không, tức là nếu một trong các đường dẫn là tổ tiên chung:
paths = […, …, …]
common_prefix = os.path.commonprefix(list_of_paths)
if common_prefix in paths:
…
Sau đó, bạn có thể tìm thấy các đường dẫn tương đối:
relative_paths = [os.path.relpath(path, common_prefix) for path in paths]
Bạn thậm chí có thể xử lý nhiều hơn hai đường dẫn, với phương thức này và kiểm tra xem tất cả các đường dẫn có nằm dưới một trong số chúng không.
PS : tùy thuộc vào đường dẫn của bạn trông như thế nào, trước tiên bạn có thể muốn thực hiện một số chuẩn hóa (điều này hữu ích trong trường hợp người ta không biết liệu chúng luôn kết thúc bằng '/' hay không, hoặc nếu một số đường dẫn có tương đối). Các hàm có liên quan bao gồm os.path.abspath () và os.path.normpath () .
PPS : như Peter Briggs đã đề cập trong các bình luận, cách tiếp cận đơn giản được mô tả ở trên có thể thất bại:
>>> os.path.commonprefix(['/usr/var', '/usr/var2/log'])
'/usr/var'
mặc dù /usr/varlà không một tiền tố chung của các đường dẫn. Buộc tất cả các đường dẫn kết thúc bằng '/' trước khi gọi commonprefix()giải quyết vấn đề (cụ thể) này.
PPPS : như bluenote10 đã đề cập, việc thêm dấu gạch chéo không giải quyết được vấn đề chung. Đây là câu hỏi tiếp theo của anh ấy: Làm thế nào để tránh sự ngụy biện của os.path.commonprefix của Python?
PPPPS : bắt đầu với Python 3.4, chúng tôi có pathlib , một mô-đun cung cấp môi trường thao tác đường dẫn saner. Tôi đoán rằng tiền tố chung của một tập hợp các đường dẫn có thể thu được bằng cách lấy tất cả các tiền tố của mỗi đường dẫn (với PurePath.parents()), lấy giao điểm của tất cả các tập hợp cha mẹ này và chọn tiền tố chung dài nhất.
PPPPPS : Python 3.5 đã giới thiệu một giải pháp phù hợp cho câu hỏi này : os.path.commonpath(), trả về một đường dẫn hợp lệ.