2011-08-17 12 views
49

Mój skrypt python wykonuje os.listdir(path), gdzie ścieżka jest kolejką zawierającą archiwa, które muszę traktować jeden po drugim.Jak ignorować ukryte pliki za pomocą os.listdir()?

Problem polega na tym, że otrzymuję listę w tablicy, a następnie po prostu wykonuję prosty array.pop(0). Wszystko działało dobrze, dopóki nie wprowadziłem projektu w działalność wywrotową. Teraz otrzymuję folder .svn w mojej tablicy i oczywiście powoduje on awarię mojej aplikacji.

Oto moje pytanie: czy istnieje istniejąca funkcja, która ignoruje ukryte pliki podczas wykonywania os.listdir(), a jeśli nie, jaki byłby najlepszy sposób?

Dziękuję.

Odpowiedz

60

można napisać samemu:

def listdir_nohidden(path): 
    for f in os.listdir(path): 
     if not f.startswith('.'): 
      yield f 

Lub możesz użyć glob:

def listdir_nohidden(path): 
    return glob.glob(os.path.join(path, '*')) 

Każda z nich będzie ignorować wszystkie nazwy plików rozpoczynające się '.'.

+1

proponowana funkcja 'listdir_nohidden' nie jest całkiem zgodny z' os.listdir', ponieważ użycie 'yield' czyni go generatorem. Zamiast tego powinien przejść przez listę wyjściową z 'os.listdir' i usunąć wpisy zaczynające się od". " – 0sh

+1

@ 0sh: Dlaczego musi usuwać rzeczy na miejscu? Po prostu zdefiniuj nową funkcję, która zawiera 'list (listdir_nohidden (path))' i ta nowa funkcja jest dokładnie zgodna z 'os.listdir'. – abarnert

10

glob:

>>> import glob 
>>> glob.glob('*') 

(. glob roszczenia do korzystania listdir i fnmatch pod maską, ale także sprawdza wiodącego '.', nie używając fnmatch)

13

na Windows, Linux i OS X:

if os.name == 'nt': 
    import win32api, win32con 


def folder_is_hidden(p): 
    if os.name== 'nt': 
     attribute = win32api.GetFileAttributes(p) 
     return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM) 
    else: 
     return p.startswith('.') #linux-osx 
+2

powinien również działać na komputerze Mac, ukryte pliki zaczynają się od "." także. –

+0

To jest jedyna przenośna odpowiedź, świetna robota, ale inne odpowiedzi zapewniają pełne opakowanie dla os.listdir, więc ... '[f dla f w os.listdir (ścieżka) jeśli nie folder_is_hidden (f)]' – SensorSmith

12
filter(lambda f: not f.startswith('.'), os.listdir('.')) 
13

Jest to stary pytanie, ale wydaje się, że brakuje oczywistą odpowiedź korzystania listowych, więc dodaję ją tutaj kompletność:

[f for f in os.listdir(path) if not f.startswith('.')] 

na marginesie, docs stan listdir zwróci wyniki w „dowolnej kolejności”, ale wspólnej przypadku użycia jest mieć je posortowane alfabetycznie. Jeśli chcesz zawartość katalogów alfabetycznie posortowane bez odniesieniu do kapitalizacji, można użyć:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower()) 
0
filenames = (f.name for f in os.scandir() if not f.name.startswith('.')) 
Powiązane problemy