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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top