Próbuję stworzyć skrypt, który wyświetli listę wszystkich katalogów, podkatalogów i plików w podanym katalogu.
Próbowałem tego:
import sys,os
root = "/home/patate/directory/"
path = os.path.join(root, "targetdirectory")
for r,d,f in os.walk(path):
for file in f:
print os.path.join(root,file)
Niestety nie działa poprawnie.
Dostaję wszystkie pliki, ale nie pełne ścieżki.
Na przykład, jeśli struktura dir byłaby:
/home/patate/directory/targetdirectory/123/456/789/file.txt
Wypisze:
/home/patate/directory/targetdirectory/file.txt
Potrzebuję pierwszego wyniku. Każda pomoc byłaby bardzo mile widziana! Dzięki.
Na wszelki wypadek ... Pobieranie wszystkich plików w katalogu i podkatalogach pasujących do jakiegoś wzorca (na przykład * .py):
źródło
Oto jedna linijka:
Najbardziej zewnętrzna
val for sublist in ...
pętla spłaszcza listę, aby była jednowymiarowa.j
Pętla pobiera listę wszystkich plików basename i dołącza je do bieżącej ścieżki. Na konieci
pętla iteruje po wszystkich katalogach i podkatalogach.Ten przykład wykorzystuje zakodowaną ścieżkę
./
wos.walk(...)
wywołaniu, możesz uzupełnić dowolny ciąg ścieżki.Uwaga:
os.path.expanduser
i / lubos.path.expandvars
mogą być używane dla ciągów ścieżek, takich jak~/
Rozszerzając ten przykład:
Łatwo jest dodać testy nazw plików i testy nazw katalogów.
Na przykład testowanie
*.jpg
plików:Dodatkowo z wyłączeniem
.git
katalogu:źródło
os.walk
na ręczną pętlę dirlisting, generatory są świetne, przejdź z nich korzystać.Nie udało się skomentować, więc piszę odpowiedź tutaj. Oto najbardziej przejrzysta jedna linia, jaką widziałem:
źródło
Możesz spojrzeć na tę próbkę, którą zrobiłem. Używa funkcji os.path.walk, która jest przestarzała, uważaj. Używa listy do przechowywania wszystkich ścieżek plików
źródło
Nieco prostsza jedna linijka:
źródło
Ponieważ każdy przykład tutaj używa tylko
walk
(zjoin
), chciałbym pokazać ładny przykład i porównanie zlistdir
:Jak więc sam widzisz,
listdir
wersja jest znacznie wydajniejsza. (i tojoin
jest powolne)źródło