Tôi có một danh sách các đường dẫn mà tôi cần kiểm tra các tệp bên trong. Tất nhiên, nếu tôi được đưa ra một thư mục gốc, và một thư mục con, không cần phải xử lý thư mục con. Ví dụ:Cách xác định đường dẫn có phải là thư mục phụ của thư mục khác không?
c:\test // process this
c:\test\pics // do not process this
c:\test2 // process this
Làm cách nào tôi có thể biết (nền tảng chéo) rằng đường dẫn không phải là thư mục phụ của người khác. Tốt hơn tôi muốn điều này là nền tảng chéo, và không lo lắng về các liên kết tượng trưng miễn là chúng không có chu kỳ (trường hợp xấu hơn là tôi sẽ xử lý dữ liệu hai lần).
UPDATE: đây là mã tôi đã kết thúc sử dụng, nhờ @FJ
def unique_path_roots(paths):
visited = set()
paths = list(set(paths))
for path in sorted(paths,key=cmp_to_key(locale.strcoll)):
path = normcase(normpath(realpath(path)))
head, tail = os.path.split(path)
while head and tail:
if head in visited:
break
head, tail = os.path.split(head)
else:
yield path
visited.add(path)
Đây sẽ là nhanh hơn so với đề nghị của tôi bởi vì nó thiết lập kiểm tra thành viên chứ không phải quét một danh sách. Tôi thích nó. – kindall
@ F.J dường như là một vòng lặp infitie, đầu giảm xuống c: \ tại chính cơ sở của nó và không bao giờ được đặt thành Không. – esac
@esac - Xin lỗi về điều đó, tôi đã nghĩ rằng trong trường hợp cơ sở nó sẽ đặt mọi thứ vào đuôi, không phải đầu. Xem bản chỉnh sửa của tôi để khắc phục sự cố. –