2012-11-19 32 views
25

Tüm dosyaları bir klasör içinde içeren dizin yolu ile listelemeye ihtiyacım var. Açıkçası mükemmel bir çözüm olacak olan os.walk'u kullanmayı denedim. Bununla birlikte, gizli klasörleri ve dosyaları da listelemektedir. Uygulamamın gizli klasörleri veya dosyaları listelememesini istiyorum. Herhangi bir gizli dosya vermemek için kullanabileceğiniz herhangi bir bayrak var mı?os.walk

Çapraz platform sadece linux için çalışırsa tamam, benim için çok önemli değil (. * Deseni)

+1

Ne platformu sen? 'gizli' farklı işletim sistemlerinde farklı anlamlara sahiptir. –

+0

Linux'tayım, cevabı üzerine ekleyeceğim. – lolopop

cevap

56

Hayır, bunlar atlarsınız os.walk() için hiçbir seçeneği yoktur. Sen (kolay yeter) böylece kendiniz yapmak gerekir:

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 

Not dirs[:] = dilim ataması; os.walk(), os.walk() öğelerini (dirs ile belirtilen listede değil) değiştirerek os.walk() silinmiş dizinleri işlemeyecek şekilde değiştiriyoruz. topdownTrue olduğunda

, arayan yerinde dirnames listesini değiştirebileceğiniz (belki del veya dilim ataması kullanarak): Eğer documentation of os.walk() itibaren True için topdown kelime argümanı tutarsanız

Bu yalnızca çalışır ve walk() yalnızca adları adreslerinde kalan alt dizinlere yeniden girer; Bu, aramayı ayarlamak, ziyaretin belirli bir sırasını emmek, hatta walk() numarasını yeniden çağırmak için walk() numarasını arayanlar veya yeniden isimleri hakkında bilgilendirmek için kullanılabilir.

+0

Çok teşekkürler, listeleri yerinde değiştirebileceğinizi bilmiyordum! – lolopop

+0

Bunu çalıştırdım ancak konsola hiçbir şey yazdırmadı. Bu şekilde bulunan dosyaları görüntülemek için tipik yöntem nedir? Sonunda baskı kökü, direkler, dosyalar 'ekledim ama çok dağınık çıktı. – user5359531

+1

@ user5359531: Bu tamamen sizin menemenize bağlıdır; '\ n'.join ([os.path.join (root, f)' yi dirs + dosyaları için f) yazabilirdiniz.) ', vb –

5

Ben söz konusu istendi değil, ama ben özellikle __ ile __pycache__ dizinleri başlayan gizli dosyaları ve dosyaları hem dışlamak istediği benzer bir sorun vardı farkında. Bu soruya indim çünkü liste anladığımın neden beklediğimi yapmadığını anlamaya çalışıyorum. Listeyi dirnames[:] ile değiştirmiyordum.

Ben dışlamak istediği önekleri bir liste oluşturduk ve şöyle yerde dirnames modifiye:

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

mükemmel bir yanıt, listeye göre hariç tutmak için mükemmel çalışır – jpwynn

+1

FYI, 'startwith' da bir dizi tuple alabilir, böylece iç döngüden kurtulabilir ve sadece' 'dirname.startswith '' (exclude_prefixes)' https://docs.python.org/2/library/stdtypes .html # str.startswith (python 2.5 ve üstü) –