2009-03-01 16 views
7

Podczas korzystania z metody os.listdir muszę powiedzieć, który element na liście wynikowej jest katalogiem lub po prostu plikiem.Jak mogę powiedzieć plik z katalogu w Pythonie?

Mam do czynienia z problemem, kiedy musiałem przejść przez wszystkie katalogi na tej liście, a następnie dodać plik w każdym katalogu.

Czy istnieje sposób na przejrzenie tej listy i usunięcie z niej wszystkich plików? Jeśli nie można tego zrobić z os.listdir, to jakiej metody powinienem użyć?

Dzięki.

Odpowiedz

16

Użyj od os.path.isdir, aby odfiltrować katalogi. Ewentualnie coś

dirs = filter(os.path.isdir, os.listdir('/path')) 
for dir in dirs: 
    # add your file 
+1

Dzięki za szybką odpowiedź! Sprawdziłem pomoc (os.path) i odkryłem, że być może isfile (path) też będzie użyteczny. isdir (s) Zwraca wartość true, jeśli ścieżka odnosi się do istniejącego katalogu. isfile (ścieżka) Sprawdź, czy ścieżka jest zwykłym plikiem. –

+0

Nie zapomnij o teście, jeśli plik jest miękkim łączem: islink, i jeśli jest to punkt montowania dla urządzenia. –

+4

Heads up, że 'listdir()' nie zwraca plików i katalogów danej ścieżki (''/path'' w przykładzie) z bezwzględnymi ścieżkami, ale tylko nazwa pliku. I myślę, że 'isdir()'/'isfile()' etc sprawdza w stosunku do bieżącego katalogu roboczego, więc 'filter()' może nie działać, dopóki nie zwrócisz zwróconych wartości 'listdir' do ścieżek. – Parham

2

katalogi = filtr (os.path.isdir, os.listdir ('/ path'))

Uwaga ta nie będzie działać, chyba że '/ ścieżka' jest aktualny katalog roboczy. os.listdir() zwraca nazwy, więc będziesz pytał "os.path.isdir ('file.txt')", a jeśli bieżący katalog jest w innym miejscu, będziesz szukał niewłaściwego pliku "file.txt".

os.path.join() należy użyć na wyjściu os.listdir(), aby uzyskać pełną nazwę pliku.

children= [os.path.join('/path', child) for child in os.listdir('/path')] 
directories= filter(os.path.isdir, children) 
+0

Zrobiłem to w ten sposób. katalog = os.listdir (kierunek) i = len (kierunek) -1 podczas i> -1: jeśli os.path.isfile (odir + '\\' + DIR [i]) del dir [i] i = i-1 gdzie katalog to katalog zdefiniowany przez użytkownika. Działa dobrze. –

+0

Zapomniałem wspomnieć: odir = dir # 'odir' oznacza 'oryginalny katalog' Tak więc 'odir' zawiera katalog zdefiniowany przez użytkownika, po tym jak 'dir' zostanie zmieniony na listę. P.S. Czy istnieje sposób na edytowanie komentarzy? O_o –

+0

Usuwasz je i ponownie publikujesz, udając, że nic się nie stało :-) – bobince

7

To może być szybciej:

current, dirs, files = os.walk('/path').next() 

Lista katalogów będzie w zmiennej dirs.

+0

Zgoda!Spróbuję też, dzięki. –

+1

niesamowite, bardzo ładne metody – Serg

Powiązane problemy