Wiem, że możemy użyć os.walk()
do wyświetlenia wszystkich podkatalogów lub wszystkich plików w katalogu. Chciałbym jednak wymienić pełną zawartość drzewa katalogów:
- Subdirectory 1:
- file11
- file12
- Sub-sub-directory 11:
- file111
- file112
- Subdirectory 2:
- file21
- sub-sub-directory 21
- sub-sub-directory 22
- sub-sub-sub-directory 221
- file 2211
Jak najlepiej to osiągnąć w Pythonie?
ValueError: zero length field name in format
zostaje wyrzucony.root.replace(startpath, '', 1)
powinna to naprawićPodobny do odpowiedzi powyżej, ale dla pythona3, prawdopodobnie czytelny i prawdopodobnie rozszerzalny:
Przykładowe użycie:
Przykładowe dane wyjściowe:
Uwagi
Edytować:
źródło
Rozwiązanie bez wcięcia:
os.walk wykonuje już poszukiwany spacer z góry na dół, w głąb.
Ignorowanie listy katalogów zapobiega nakładaniu się, o którym wspomniałeś.
źródło
NameError: name 'path' is not defined
Zwykle wolimy po prostu używać drzewa GNU, ale nie zawsze mamy go
tree
w każdym systemie, a czasami Python 3 jest dostępny. Dobra odpowiedź w tym miejscu może być łatwo skopiowana i wklejona, a GNU nie będzietree
wymaganiem.tree
Wynik wygląda następująco:Utworzyłem powyższą strukturę katalogów w moim katalogu domowym w katalogu, który wywołuję
pyscratch
.Widzę tu również inne odpowiedzi, które podchodzą do tego rodzaju wyników, ale myślę, że możemy zrobić to lepiej, stosując prostszy, nowocześniejszy kod i leniwie oceniające podejścia.
Drzewo w Pythonie
Na początek użyjmy tego przykładu
Path
obiektu Python 3yield
iyield from
(które tworzą funkcję generatora)i teraz:
wydruki:
Musimy zmaterializować każdy katalog w postaci listy, ponieważ musimy wiedzieć, jak długi jest, ale później wyrzucamy listę. W przypadku głębokiej i szerokiej rekurencji powinno to być wystarczająco leniwe.
Powyższy kod wraz z komentarzami powinien wystarczyć, aby w pełni zrozumieć, co tutaj robimy, ale nie krępuj się go przejść za pomocą debugera, aby lepiej go zebrać, jeśli zajdzie taka potrzeba.
Więcej funkcji
Teraz GNU
tree
daje nam kilka przydatnych funkcji, które chciałbym mieć dzięki tej funkcji:n directories, m files
-L level
-d
Ponadto, gdy istnieje ogromne drzewo, warto ograniczyć iterację (np. Za pomocą
islice
), aby uniknąć blokowania interpretera tekstem, ponieważ w pewnym momencie dane wyjściowe stają się zbyt szczegółowe, aby były przydatne. Domyślnie możemy ustawić to arbitralnie wysoko - powiedzmy1000
.Usuńmy więc poprzednie komentarze i wypełnijmy tę funkcjonalność:
Teraz możemy uzyskać takie same wyniki, jak
tree
:wydruki:
Możemy ograniczyć się do poziomów:
wydruki:
Możemy ograniczyć dane wyjściowe do katalogów:
wydruki:
Z mocą wsteczną
Z perspektywy czasu mogliśmy użyć
path.glob
do dopasowania. Moglibyśmy również użyćpath.rglob
do rekurencyjnego globbingu, ale wymagałoby to przepisania. Moglibyśmy również użyćitertools.tee
zamiast materializowania listy zawartości katalogu, ale mogłoby to mieć negatywne kompromisy i prawdopodobnie uczyniłoby kod jeszcze bardziej złożonym.Komentarze są mile widziane!
źródło
elif not limit_to_directories:
dodaniu następujących elementów:info = prefix + pointer + path.name; try: with path.open('r') as f: n_lines = len(f.readlines()); loc = f' LOC: {n_lines}'; info += loc; except UnicodeDecodeError: pass; yield info
Zobacz to łącze, aby uzyskać prawidłowe odstępy.contents
musi być filtrowane, jeślilimit_to_directories
ma wartość True. W przeciwnym razie, jeśli folder nie ma katalogu na ostatni plik, drzewo nie zostanie poprawnie narysowane.if limit_to_directories: contents = [path for path in contents if path.is_dir()]
list(dir_path.iterdir())
zwracaniu odpowiednio uporządkowanego odgórnego drzewa struktury katalogów. Nie widzę takiej gwarancji w API dla iterdir () . Proszę podać odniesienie, w jaki sposóbiterdir()
zamawia się lub gwarantuje, że zapewni żądane zamówienie.os.listdir()
domyślnie - co nie gwarantuje kolejności : „Lista jest w dowolnej kolejności i nie zawiera wpisów specjalnych”. i „..”, nawet jeśli znajdują się w katalogu. "Przyszedłem tutaj, szukając tego samego i użyłem dla mnie odpowiedzi dhobbs. Aby podziękować społeczności, dodałem kilka argumentów do zapisu do pliku, zgodnie z prośbą Akshay, i uczyniłem wyświetlanie plików opcjonalnymi, aby nie było to tak bitowe wyjście. Ustawiono również wcięcie jako opcjonalny argument, więc możesz go zmienić, ponieważ niektórzy lubią 2, a inni wolą 4.
Używał różnych pętli, więc ta, która nie wyświetla plików, nie sprawdza, czy musi przy każdej iteracji.
Mam nadzieję, że pomoże to komuś innemu, ponieważ pomogła mi odpowiedź dhobbsa. Wielkie dzięki.
źródło
Na podstawie tego fantastycznego postu
http://code.activestate.com/recipes/217212-treepy-graphically-displays-the-directory-structur/
Oto wyrafinowanie, aby zachowywać się dokładnie tak
http://linux.die.net/man/1/tree
źródło
Jeśli ktoś jest zainteresowany - ta funkcja rekurencyjna zwraca zagnieżdżoną strukturę słowników. Klucze to
file system
nazwy (katalogów i plików), wartościami są:file_token
)W tym przykładzie ciągi oznaczające pliki są puste. Mogą to być także np. Dane zawartości pliku lub informacje o jego właścicielu lub uprawnienia lub obiekt inny niż dict. O ile nie jest to słownik, można go łatwo odróżnić od „typu katalogu” w dalszych operacjach.
Posiadanie takiego drzewa w systemie plików:
Rezultatem będzie:
Jeśli ci się to podoba, utworzyłem już pakiet (python 2 i 3) z tymi rzeczami (i fajnym
pyfakefs
pomocnikiem): https://pypi.org/project/fsforge/źródło
Oprócz powyższej odpowiedzi dhobbsa ( https://stackoverflow.com/a/9728478/624597 ), tutaj jest dodatkowa funkcja przechowywania wyników w pliku (osobiście używam jej do kopiowania i wklejania do FreeMind, aby mieć ładny przegląd strukturę, dlatego użyłem tabulatorów zamiast spacji dla wcięć):
źródło
Możesz wykonać polecenie „drzewo” powłoki Linuksa.
Instalacja:
Używanie w Pythonie
Przykład:
Zapewnia to czystszą strukturę, jest wizualnie bardziej wszechstronna i łatwa do wpisania.
źródło
To rozwiązanie będzie działać tylko wtedy, gdy
tree
zainstalowałeś w swoim systemie. Jednak zostawiam to rozwiązanie na wypadek, gdyby komuś pomogło.Możesz powiedzieć drzewu, aby wyświetlało strukturę drzewa jako XML (
tree -X
) lub JSON (tree -J
). JSON można oczywiście analizować bezpośrednio w Pythonie, a XML można łatwo odczytać za pomocąlxml
.Na przykładzie następującej struktury katalogów:
XML
JSON
źródło
Może szybciej niż @ellockie (może)
Wyniki testu na zrzucie ekranu poniżej:
źródło
Tutaj możesz znaleźć kod z następującymi danymi wyjściowymi: https://stackoverflow.com/a/56622847/6671330
źródło
Dla tych, którzy wciąż szukają odpowiedzi. Oto rekurencyjne podejście do pobierania ścieżek w słowniku.
źródło
Odpowiedź @ dhobbs jest świetna!
ale po prostu zmień na łatwe, aby uzyskać informacje o poziomie
i wyjście podobne
możesz uzyskać poziom według
|
liczby!źródło