Dostaję listę ścieżek, które muszę sprawdzić pliki wewnątrz. Oczywiście, jeśli dostaję root i podkatalog, nie ma potrzeby przetwarzania podkatalogu. Na przykład:Jak ustalić, czy ścieżka jest podkatalogiem innej?
c:\test // process this
c:\test\pics // do not process this
c:\test2 // process this
Jak mogę stwierdzić (cross platform), że ścieżka nie jest podkatalogiem drugiej. Najlepiej byłoby, gdyby była to platforma krzyżowa i nie martwię się dowiązaniami symbolicznymi, o ile nie są one cykliczne (najgorszy przypadek polega na tym, że dwukrotnie przetwarzam dane).
UPDATE: Oto kod I skończył przy użyciu, dzięki @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)
to będzie szybciej niż moją sugestią, ponieważ ma ustawiony testy członkostwa zamiast skanowania listy. Lubię to. – kindall
@ F.J wydaje się być pętlą infitie, głowa redukuje się do c: \ w swojej bazie i nigdy nie zostaje ustawiona na Brak. – esac
@esac - Przepraszam, myślałem, że w podstawowym przypadku wszystko włoży do ogona, a nie do głowy. Zobacz moją edycję, która powinna rozwiązać problem. –