2012-11-19 10 views
25

Potrzebuję wyświetlić wszystkie pliki z zawartą ścieżką katalogu wewnątrz folderu. Próbowałem użyć os.walk, co oczywiście byłoby idealnym rozwiązaniem.os.walk bez ukrytych folderów

Jednak zawiera również listę ukrytych folderów i plików. Chciałbym, aby moja aplikacja nie wyświetlała żadnych ukrytych folderów lub plików. Czy jest jakaś flaga, której można użyć, aby nie dostarczała żadnych ukrytych plików?

Cross-platform nie jest dla mnie bardzo ważne, że jest ok, czy to działa tylko na Linux (. * Wzór)

+1

Co platforma jesteś stronie? "ukryty" ma różne znaczenie w różnych systemach operacyjnych. –

+0

Jestem na Linuksie, dodam to w odpowiedzi. – lolopop

Odpowiedz

56

Nie, nie ma opcji, aby os.walk() że będzie pominąć tych. Musisz to zrobić samemu (co jest dość łatwe):

for root, dirs, files in os.walk(path): 
    files = [f for f in files if not f[0] == '.'] 
    dirs[:] = [d for d in dirs if not d[0] == '.'] 
    # use files and dirs 

Uwaga przypisanie dirs[:] = plaster; zastępujemy elementy w dirs (a nie na liście, do której odnosi się dirs), aby os.walk() nie przetworzyło usuniętych katalogów.

To działa tylko jeśli trzymać argument topdown słów kluczowych, aby True, od documentation of os.walk():

Kiedy topdown jest True, dzwoniący może modyfikować listę dirnames w miejscu (być może przy użyciu del lub powierzenie Slice) i walk() będą się powtarzały tylko w podkatalogach, których nazwy pozostały w nazwach nazw; może to służyć do przycinania wyszukiwania, narzucania określonej kolejności odwiedzin, a nawet informowania o katalogach, które wywołujący tworzy lub zmienia, zanim ponownie odtworzy się.

+0

Wielkie dzięki, nie wiedziałem, że możesz modyfikować listy w miejscu! – lolopop

+0

Uruchomiłem to, ale nic nie wydrukowałem na konsoli. Jaka jest typowa metoda wyświetlania plików znalezionych w ten sposób? Dodałem 'print root, dirs, files' na końcu, ale wyszło bardzo niechlujnie. – user5359531

+1

@ user5359531: to zależy całkowicie od twojego użycia; możesz "wydrukować" \ n'.join ([os.path.join (root, f) dla f w dirs + files]) ', itd. –

5

Zdaję sobie sprawę, że nie pytano w pytaniu, ale miałem podobny problem, gdzie chciałem, aby wykluczyć zarówno ukryte pliki i pliki rozpoczynające się __ konkretnie __pycache__ katalogów. Wylądowałem na to pytanie, ponieważ próbowałem dowiedzieć się, dlaczego moja lista nie spełniała moich oczekiwań. Nie zmieniałem listy w miejscu z dirnames[:].

stworzyłem listę prefiksów chciałem wykluczyć i zmodyfikowała dirnames w miejscu tak:

exclude_prefixes = ('__', '.') # exclusion prefixes 
    for dirpath, dirnames, filenames in os.walk(node): 
     # exclude all dirs starting with exclude_prefixes 
     dirnames[:] = [dirname 
         for dirname in dirnames 
         if not dirname.startswith(exclude_prefixes)] 
+0

która jest świetną odpowiedzią, działa idealnie do wykluczania zgodnie z listą – jpwynn

+1

FYI, 'startswith' może również przyjąć krotkę łańcuchów, więc możesz pozbyć się wewnętrznej pętli for i po prostu użyć' not dirname.startswith (exclude_prefixes) 'https://docs.python.org/2/library/stdtypes .html # str.startswith (python 2.5 i nowsze) –

Powiązane problemy