Mein Python-Skript führt eine aus, os.listdir(path)
bei der der Pfad eine Warteschlange mit Archiven ist, die ich einzeln behandeln muss.
Das Problem ist, dass ich die Liste in einem Array bekomme und dann einfach eine mache array.pop(0)
. Es hat gut funktioniert, bis ich das Projekt in Subversion versetzt habe. Jetzt bekomme ich den .svn
Ordner in mein Array und natürlich stürzt meine Anwendung ab.
Hier ist meine Frage: Gibt es eine Funktion, die versteckte Dateien bei der Ausführung eines ignoriert os.listdir()
und wenn nicht, was wäre der beste Weg?
python
hidden-files
Talnicolas
quelle
quelle
listdir_nohidden
ist nicht ganz kompatibel mitos.listdir
, da die Verwendung vonyield
es zu einem Generator macht. Stattdessen sollte es die Ausgabeliste von durchlaufenos.listdir
und Einträge entfernen, die mit '.' Beginnen.list(listdir_nohidden(path))
genau funktioniert und mit der diese neue Funktion genau kompatibel istos.listdir
.Dies ist eine alte Frage, aber es scheint, als ob die offensichtliche Antwort auf die Verwendung des Listenverständnisses fehlt. Der Vollständigkeit halber füge ich sie hier hinzu:
[f for f in os.listdir(path) if not f.startswith('.')]
Nebenbei bemerkt, der Dokumentstatus
listdir
gibt die Ergebnisse in "beliebiger Reihenfolge" zurück. Ein häufiger Anwendungsfall ist jedoch, sie alphabetisch sortieren zu lassen. Wenn Sie möchten, dass der Verzeichnisinhalt ohne Berücksichtigung der Groß- und Kleinschreibung alphabetisch sortiert wird, können Sie Folgendes verwenden:sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
quelle
key=lambda f: f.lower()
kann ohne Lambda geschrieben werden:key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
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
quelle
[f for f in os.listdir(path) if not folder_is_hidden(f)]
Joshmaker hat die richtige Lösung für Ihre Frage.
Wie ignoriere ich versteckte Dateien mit os.listdir ()?
In Python 3 wird jedoch empfohlen, pathlib anstelle von os zu verwenden.
from pathlib import Path visible_files = [ file for file in Path(".").iterdir() if not file.name.startswith(".") ]
quelle
glob :
>>> import glob >>> glob.glob('*')
(
glob
behauptet zu verwendenlistdir
undfnmatch
unter der Haube, aber es prüft auch auf eine Führung'.'
, nicht durch Verwendungfnmatch
.)quelle
Ich denke, es ist zu viel Arbeit, alle Elemente in einer Schleife durchzugehen. Ich würde etwas Einfacheres wie dieses bevorzugen:
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')
Für die Plattformunabhängigkeit, wie @Josh erwähnte, funktioniert der Glob gut:
import glob glob.glob('*')
quelle
.DS_Store
automatisch erstellt. Wenn ich alle Dateien komprimiere und auf einen Server schiebe, wird.DS_Store
auch hinzugefügt. Wenn es verschiedene versteckte Dateien gibt, können Sie versuchenos.system('ls -1')
os.popen('ls -1').read()
funktioniert nicht unter Windows. Das ist der springende Punktos.listdir()
.filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
quelle