Piszę skrypt, który schodzi do drzewa katalogów (używając os.walk ()), a następnie odwiedza każdy plik pasujący do określonego rozszerzenia. Ponieważ jednak niektóre drzewa katalogów, w których moje narzędzie będzie używane, zawierają również podkatalogi, które z kolei zawierają DUŻO bezużytecznych (na potrzeby tego skryptu) rzeczy, pomyślałem, że dodam opcję dla użytkownika do określenia lista katalogów do wykluczenia z przemierzania.
Jest to dość łatwe dzięki os.walk (). W końcu to do mnie należy decyzja, czy faktycznie chcę odwiedzić odpowiednie pliki / katalogi udostępnione przez os.walk (), czy po prostu je pominąć. Problem w tym, że jeśli mam np. Drzewo katalogów takie jak to:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
i chcę wykluczyć uselessStuff i wszystkie jego elementy podrzędne, os.walk () nadal będzie schodzić do wszystkich (potencjalnie tysięcy) podkatalogów uselessStuff , co, rzecz jasna, bardzo spowalnia działanie. W idealnym świecie mógłbym powiedzieć os.walk (), aby nawet nie zawracał sobie głowy dawaniem kolejnych dzieci uselessStuff , ale o ile wiem, nie ma na to sposobu (prawda?).
Czy ktoś ma pomysł? Może istnieje biblioteka innej firmy, która udostępnia coś takiego?
dirs[:] =
?dirs[:] = value
modyfikujedirs
w miejscu . Zmienia zawartość listydirs
bez zmiany kontenera. Jakhelp(os.walk)
wspomniano, jest to potrzebne, jeśli chcesz wpłynąć na sposóbos.walk
przechodzenia przez podkatalogi. (dirs = value
po prostu ponownie przypisuje (lub „wiąże”) zmiennądirs
do nowej listy, bez modyfikowania oryginałudirs
.)filter()
:dirs[:] = list(filter(lambda x: not x in exclude, dirs))
os.walk
i dajeroot, dirs, files
po wykluczeniu.git
(lub czegokolwiek innego) zdirs
.... alternatywna forma doskonałej odpowiedzi @ unutbu, która brzmi trochę bardziej bezpośrednio, biorąc pod uwagę, że celem jest wykluczenie katalogów kosztem czasu O (n ** 2) vs O (n).
(
list(dirs)
Do poprawnego wykonania wymagane jest wykonanie kopii listy katalogów z )źródło
dirs[:] = set(dirs) - exclude
. Przynajmniej nadal jest \ $ O (n) \ $ i nie budujesz zrozumienia tylko dla jego skutków ubocznych ...for d in list(dirs)
jest trochę dziwne.dirs
jest już listą. A to, co masz, nie jest tak naprawdę zrozumieniem listy.dirs.remove(d)
nic nie zwraca, więc otrzymujesz listę pełnąNone
s. Zgadzam się z @Torsten.