webentwicklung-frage-antwort-db.com.de

Wie ignoriere ich versteckte Dateien mit os.listdir ()?

Mein python Skript führt eine os.listdir(path) aus, wobei der Pfad eine Warteschlange ist, die Archive enthält, die ich einzeln behandeln muss.

Das Problem ist, dass ich die Liste in einem Array erhalte und dann einfach eine einfache array.pop(0) mache. Es hat einwandfrei funktioniert, bis ich das Projekt in Subversion eingestellt habe. Jetzt erhalte ich den Ordner .svn In meinem Array und natürlich stürzt meine Anwendung ab.

Hier ist meine Frage: Gibt es eine Funktion, die versteckte Dateien ignoriert, wenn sie eine os.listdir() ausführt, und wenn nicht, was wäre der beste Weg?

Vielen Dank.

68
talnicolas

Sie können selbst schreiben:

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

Oder Sie können ein glob verwenden:

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

In beiden Fällen werden alle Dateinamen ignoriert, die mit '.' Beginnen.

79
Adam Rosenfield

Dies ist eine alte Frage, aber anscheinend fehlt die offensichtliche Antwort auf die Verwendung des Listenverständnisses. Der Vollständigkeit halber füge ich sie hier hinzu:

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

Als Randnotiz gibt der Dokumentstatus listdir die Ergebnisse in 'willkürlicher Reihenfolge' zurück. Ein häufiger Anwendungsfall ist jedoch, sie alphabetisch zu sortieren. Wenn Sie den Verzeichnisinhalt unabhängig von der Groß- und Kleinschreibung alphabetisch sortieren möchten, können Sie Folgendes verwenden:

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

Unter Windows, Linux und 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
16
cle
filter( lambda f: not f.startswith('.'), os.listdir('.'))
12
scum

glob :

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

(glob gibt an, listdir und fnmatch unter der Haube zu verwenden, sucht aber auch nach einem führenden '.', nicht mit fnmatch.)

11
Josh Lee

Ich denke, es ist zu viel Arbeit, um alle Elemente in einer Schleife durchzugehen. Ich würde etwas Einfacheres vorziehen:

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

Wenn das Verzeichnis mehr als eine versteckte Datei enthält, kann dies helfen:

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')
6
user 923227
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
1
amenbo