2011-08-17 14 views
49

Python betiğimde bir yolun tek tek ele almam gereken arşivleri içeren bir sıra olduğu bir os.listdir(path) yürütülür. Sorun, bir dizide liste alıyorum ve sonra basit bir array.pop(0) yapmam sorunudur. Projeyi yıkıma uğrayana kadar iyi çalışıyordu. Şimdi dizimde .svn klasörünü alıyorum ve tabii ki uygulama çöküyor.os.listdir() kullanılarak gizli dosyalar nasıl yok sayılır?

İşte benim sorum şu: bir os.listdir() yürütürken gizli dosyaları yok sayan ve en iyi yol ne olmazsa varolan bir işlev var mı?

Teşekkür ederiz.

cevap

60

Birini yazabilir kendiniz:

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

Yoksa glob kullanabilirsiniz:

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

Bunların Ya '.' ile başlayan tüm dosya adlarını dikkate almaz. Windows, Linux ve OS X'te

+1

önerilen fonksiyonu 'listdir_nohidden' os.listdir'' ile oldukça uyumlu değildir, yield' 'kullanımı beri onu bir jeneratör yapar. Bunun yerine, çıktı listesinden 'os.listdir'den geçmeli ve '.' Ile başlayan girişleri kaldırmalıdır. – 0sh

+1

@ 0sh: Neden şeyleri yerinde kaldırmak zorunda? Sadece listeyi (listdir_nohidden (yol)) 'i çalıştıran yeni bir fonksiyon tanımlayın ve bu yeni fonksiyon tam olarak' os.listdir' ile uyumludur. – abarnert

10

glob:

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

(. glob iddialar başlık altında listdir ve fnmatch kullanmak, ama aynı zamanda değil fnmatch kullanarak, önde gelen '.' denetler)

13

:

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

da bir Mac üzerinde çalışmalıdır, gizli dosyalar orada 'ile başlar. de. –

+0

Bu tek taşınabilir cevap, harika bir iş, ama diğer cevaplar os.listdir için tam bir sarıcı sağlar ... '[f fs.OfDosyada (yolunda) eğer klasör_is_hidden (f) değilse]' – SensorSmith

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

Bu eski bir sorudur, ancak liste kavrayışa bariz cevabı eksik gibi görünüyor, bu yüzden için buraya ekliyorum tamlık: bir yan not olarak

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

, devlet listdir 'keyfi sırada' ama bir genel kullanım durumunda sonuçları dönecektir docs onları alfabetik olarak sıralanmış sahip olmaktır. Eğer alfabetik harf bakımından olarak sıralanır dizin içeriğini istiyorsanız kullanabilirsiniz:

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('.'))