Os.listdir () kullanılarak gizli dosyalar nasıl göz ardı edilir?


88

Python betiğim os.listdir(path), yolun tek tek işlemem gereken arşivleri içeren bir kuyruk olduğu bir yerde çalıştırıyor .

Sorun şu ki, listeyi bir dizi halinde alıyorum ve sonra basit bir şekilde yapıyorum array.pop(0). Projeyi alt üst edene kadar iyi çalışıyordu. Şimdi dizimdeki .svnklasörü alıyorum ve tabii ki uygulamamın çökmesine neden oluyor.

Öyleyse sorum şu: bir işlevi çalıştırırken gizli dosyaları yok sayan bir işlev var mı os.listdir()ve değilse en iyi yol nedir?


Ayrıcaos.path.isdir()
HashRocketSyntax

Yanıtlar:


103

Kendiniz bir tane yazabilirsiniz:

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

Veya bir küre kullanabilirsiniz :

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

Bunlardan herhangi biri ile başlayan tüm dosya adlarını yok sayacaktır '.'.


1
önerilen işlev listdir_nohidden, os.listdirkullanımı yieldonu bir jeneratör haline getirdiğinden tam olarak uyumlu değildir . Bunun yerine, çıktı listesinin üzerinden geçmeli os.listdirve '.' İle başlayan girdileri kaldırmalıdır.
Milo Wielondek

3
@ 0sh: Neden bir şeyleri yerinde kaldırmak zorunda? Sadece bunu yapan list(listdir_nohidden(path))ve bu yeni işlevle tam olarak uyumlu olan yeni bir işlev tanımlayın os.listdir.
abarnert

50

Bu eski bir soru, ancak liste anlamayı kullanmanın bariz cevabını kaçırmış gibi görünüyor, bu yüzden tamlık için buraya ekliyorum:

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

Bir yan not olarak, dokümanlar durumu listdirsonuçları 'rastgele sırayla' döndürecektir, ancak yaygın bir kullanım durumu, bunların alfabetik olarak sıralanmasıdır. Dizin içeriklerinin büyük harf kullanımına bakılmaksızın alfabetik olarak sıralanmasını istiyorsanız, şunları kullanabilirsiniz:

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())

5
key=lambda f: f.lower()lambda olmadan yazılabilir:key=str.lower
Jean-François Fabre

2
İkisini birleştirmek için:sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
Robert

19

Windows, Linux ve OS X'te:

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
Mac'te de çalışmalıdır, gizli dosyalar "." ile başlar. yanı sıra.
Verena Haunschmid

2
Bu tek taşınabilir cevap, harika bir iş, ancak diğer cevaplar os.listdir için tam bir paketleyici sağlıyor yani ...[f for f in os.listdir(path) if not folder_is_hidden(f)]
SensorSmith


14

glob :

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

( globkullanım listdirve fnmatchkaputun altında olduğunu iddia ediyor , ancak aynı zamanda '.'kullanarak değil, bir liderlik kontrolü yapıyor fnmatch.)


6

Tüm öğeleri bir döngüde gözden geçirmek için çok fazla çalışma olduğunu düşünüyorum. Bunun gibi daha basit bir şeyi tercih ederim:

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

Dizin birden fazla gizli dosya içeriyorsa , bu yardımcı olabilir:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

Platform bağımsızlığı için @ Josh'un da belirttiği gibi glob iyi çalışıyor:

import glob
glob.glob('*')

Seninki durumunda çalışır bir gizli dosyayı, ve bunun ismini biliyorum. Ya dizinde önceden bilemeyeceğiniz rastgele adlara sahip düzinelerce gizli dosya varsa?
FeRD

Merhaba @FeRD, Evet. Mac'te toplu / biriktirme işlemlerini yaparken, tüm dosyaları yeni klasöre koyuyorum ve .DS_Storeotomatik olarak oluşturuluyor. Tüm dosyaları sıkıştırdığımda ve bir sunucuya gönderdiğimde .DS_Storede ekleniyor. Çeşitli gizli dosyalar varsa deneyebilirsinizos.system('ls -1')
kullanıcı 923227

Çapraz platform değil. os.popen('ls -1').read()Windows'ta çalışmaz. Bütün mesele bu os.listdir().
Ferd

1
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.