Wie nur Top-Level-Verzeichnisse in Python zur Liste?
-
02-07-2019 - |
Frage
Ich will nur die Verzeichnisse innerhalb einiger Ordner zur Liste können. Das bedeutet, ich will nicht Dateinamen aufgeführt, noch habe ich weitere Ordner möchten.
Lassen Sie uns sehen, ob ein Beispiel hilft. Im aktuellen Verzeichnis haben wir:
>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
'Tools', 'w9xpopen.exe']
Doch ich will nicht Dateinamen aufgeführt. Ich auch nicht Unterordner wie \ Lib \ Flüche wollen. Im Wesentlichen, was ich will Arbeiten mit dem folgenden:
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
Allerdings frage ich mich, ob es einen einfacheren Weg, um die gleichen Ergebnisse zu erzielen. Ich habe den Eindruck, dass die Verwendung os.walk nur die oberste Ebene zurückzukehren ist ineffizient / zu viel.
Lösung
Filter das Ergebnis mit os.path.isdir () (und verwendet os.path.join (), um den tatsächlichen Pfad zu bekommen):
>>> [ name for name in os.listdir(thedir) if os.path.isdir(os.path.join(thedir, name)) ]
['ctypes', 'distutils', 'encodings', 'lib-tk', 'config', 'idlelib', 'xml', 'bsddb', 'hotshot', 'logging', 'doc', 'test', 'compiler', 'curses', 'site-packages', 'email', 'sqlite3', 'lib-dynload', 'wsgiref', 'plat-linux2', 'plat-mac']
Andere Tipps
os.walk
Verwenden Sie os.walk
mit next
Artikel Funktion:
next(os.walk('.'))[1]
Für Python <= 2,5 Verwendung:
os.walk('.').next()[1]
Wie das funktioniert
os.walk
ist ein Generator und ruft next
wird das erste Ergebnis in Form einer 3-Tupel (dirpath, dirnames, Dateinamen) bekommen. So ist der [1]
Index gibt nur die dirnames
aus diesem Tupel.
Filtern Sie die Liste mit os.path.isdir Verzeichnisse zu erkennen.
filter(os.path.isdir, os.listdir(os.getcwd()))
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]
Beachten Sie, dass anstelle os.listdir(os.getcwd())
zu tun, es ist vorzuziehen os.listdir(os.path.curdir)
zu tun. Ein weniger Funktionsaufruf, und es ist, als tragbar.
Also, die Antwort zu vervollständigen, eine Liste der Verzeichnisse in einem Ordner zu erhalten:
def listdirs(folder):
return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
Wenn Sie volle Pfadnamen bevorzugen, dann diese Funktion verwenden:
def listdirs(folder):
return [
d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
if os.path.isdir(d)
]
nur hinzufügen, dass os.listdir mit () nicht "vs sehr einfach os.walk viel Verarbeitung nehmen (). Next () [1]" . Dies liegt daran, os.walk () verwendet os.listdir () intern. In der Tat, wenn Sie testen sie zusammen:
>>>> import timeit
>>>> timeit.timeit("os.walk('.').next()[1]", "import os", number=10000)
1.1215229034423828
>>>> timeit.timeit("[ name for name in os.listdir('.') if os.path.isdir(os.path.join('.', name)) ]", "import os", number=10000)
1.0592019557952881
Die Filterung von os.listdir () ist sehr leicht schneller.
Ein sehr viel einfacher und eleganter Weg, dies zu verwenden:
import os
dir_list = os.walk('.').next()[1]
print dir_list
Führen Sie dieses Skript im selben Ordner, für die Sie die Ordner wollen names.It gibt Sie genau die unmittelbaren Ordner nur nennen (das auch ohne den vollständigen Pfad des Ordners).
Dies scheint zu arbeiten (zumindest unter Linux):
import glob, os
glob.glob('*' + os.path.sep)
ist ein Neuling hier kann ich noch nicht direkt kommentieren, aber hier ist eine kleine Korrektur i den folgenden Teil hinzufügen möchte ΤΖΩΤΖΙΟΥ Antwort :
Wenn Sie volle Pfadnamen bevorzugen, dann diese Funktion verwenden:
def listdirs(folder): return [ d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder)) if os.path.isdir(d) ]
für diejenigen, die noch auf Python <2.4 : Der innere Aufbau benötigt eine Liste anstelle eines Tupels sein und deshalb wie folgt lauten:
def listdirs(folder):
return [
d for d in [os.path.join(folder, d1) for d1 in os.listdir(folder)]
if os.path.isdir(d)
]
sonst bekommt man einen Syntaxfehler.
Liste Verständnis verwenden,
[a for a in os.listdir() if os.path.isdir(a)]
Ich denke, es ist die einfachste Art und Weise
[x for x in os.listdir(somedir) if os.path.isdir(os.path.join(somedir, x))]
Für eine Liste der vollständigen Pfadnamen ziehe ich diese Version zu den anderen Lösungen hier:
def listdirs(dir):
return [os.path.join(os.path.join(dir, x)) for x in os.listdir(dir)
if os.path.isdir(os.path.join(dir, x))]
scanDir = "abc"
directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]
Eine sicherere Option, die nicht ausfällt, wenn kein Verzeichnis ist.
def listdirs(folder):
if os.path.exists(folder):
return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]
else:
return []
Wie so?
>>>> [path for path in os.listdir(os.getcwd()) if os.path.isdir(path)]
-- This will exclude files and traverse through 1 level of sub folders in the root
def list_files(dir):
List = []
filterstr = ' '
for root, dirs, files in os.walk(dir, topdown = True):
#r.append(root)
if (root == dir):
pass
elif filterstr in root:
#filterstr = ' '
pass
else:
filterstr = root
#print(root)
for name in files:
print(root)
print(dirs)
List.append(os.path.join(root,name))
#print(os.path.join(root,name),"\n")
print(List,"\n")
return List