पायथन में केवल शीर्ष स्तर की निर्देशिका कैसे सूचीबद्ध करें?


132

मैं कुछ फ़ोल्डर के अंदर केवल निर्देशिकाओं को सूचीबद्ध करने में सक्षम होना चाहता हूं। इसका मतलब है कि मैं फ़ाइल नाम सूचीबद्ध नहीं करना चाहता, और न ही मुझे अतिरिक्त उप-फ़ोल्डर चाहिए।

आइए देखें कि क्या कोई उदाहरण मदद करता है। वर्तमान निर्देशिका में हमारे पास है:

>>> 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']

हालाँकि, मैं फ़ाइल नाम सूचीबद्ध नहीं करना चाहता। और न ही मुझे उप-फ़ोल्डर चाहिए जैसे \ Lib \ अभिशाप। आवश्यक रूप से मैं निम्नलिखित के साथ काम करना चाहता हूं:

>>> for root, dirnames, filenames in os.walk('.'):
...     print dirnames
...     break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']

हालाँकि, मैं सोच रहा हूँ कि क्या समान परिणाम प्राप्त करने का एक सरल तरीका है। मुझे आभास होता है कि केवल शीर्ष स्तर पर लौटने के लिए os.walk का उपयोग करना अक्षम / बहुत अधिक है।

जवाबों:


125

परिणाम प्राप्त करने के लिए os.path.isdir () का उपयोग करके (और os.path.join का उपयोग करके) फ़िल्टर करें:

>>> [ 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']

17
यह बहुत ही सरल बनाम ओस्वाक () (अगले) (1)
फ़ेओ ऑक्सर Lwin

203

os.walk

आइटम फ़ंक्शन के os.walkसाथ उपयोग करें next:

next(os.walk('.'))[1]

के लिए अजगर <= 2.5 उपयोग:

os.walk('.').next()[1]

यह कैसे काम करता है

os.walkएक जनरेटर है और कॉलिंग nextको 3-टुपल (दिरपथ, dirnames, filenames) के रूप में पहला परिणाम मिलेगा। इस प्रकार [1]सूचकांक केवल dirnamesउस टपल से लौटता है ।


14
इस पर थोड़ा और विवरण यह है कि यह एक जनरेटर है, जब तक आप इसे नहीं बताएंगे, तब तक यह अन्य अवधि तक नहीं चलेगा। तो .next () [1] एक लाइन में करता है कि सभी सूची समझ क्या करते हैं। मैं शायद ऐसा कुछ करूंगा DIRNAMES=1और फिर next()[DIRNAMES]भविष्य के कोड मेंटेनर्स के लिए इसे समझना आसान बना दूंगा।
नाविक

3
+1 अद्भुत समाधान। ब्राउज़ करने के लिए एक निर्देशिका निर्दिष्ट करने के लिए, का उपयोग करें:os.walk( os.path.join(mypath,'.')).next()[1]
डैनियल रीस

42
पायथन v3 के लिए: अगला (os.walk ('।))] [1]
आंद्रे सोरेस

यदि आपका और अधिक करने के लिए जा रहा है तो पाठ प्रसंस्करण; अर्थात वास्तविक फ़ोल्डरों में प्रोसेसिंग की आवश्यकता हो सकती है, पूर्ण पथ की आवश्यकता हो सकती है:sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
DevPlayer

52

निर्देशिकाओं का पता लगाने के लिए os.path.isdir का उपयोग करके सूची को फ़िल्टर करें।

filter(os.path.isdir, os.listdir(os.getcwd()))

5
मुझे लगता है कि यह इनमें से किसी भी उत्तर में पठनीयता और संक्षिप्तता का सबसे अच्छा संयोजन है।
13

20
यह काम नहीं किया। मेरा अनुमान है कि os.listdirएक फ़ाइल / फ़ोल्डर नाम देता है, जिस पर पारित किया गया है os.path.isdir, लेकिन उत्तरार्द्ध को एक पूर्ण पथ की आवश्यकता है।
डैनियल रीस

3
फ़िल्टर os.walk से अधिक तेज़ है timeit(os.walk(os.getcwd()).next()[1]) 1000 loops, best of 3: 734 µs per loop timeit(filter(os.path.isdir, os.listdir(os.getcwd()))) 1000 loops, best of 3: 477 µs per loop
B.Kocis

14
directories=[d for d in os.listdir(os.getcwd()) if os.path.isdir(d)]

4
इसे फ़िल्टर करने के लिए छोटा किया जा सकता है (os.path.isdir, os.listdir (os.getcwd ())
John Millikin

3
क्या किसी को इस बारे में कोई जानकारी है कि क्या फ़िल्टर या एक सूची समझ तेज़ है? अन्यथा इसका सिर्फ एक व्यक्तिपरक तर्क है। बेशक यह माना जाता है कि cwd में 10 मिलियन डायरेक्टरीज़ हैं और प्रदर्शन एक मुद्दा है।
मार्क रोडी

12

ध्यान दें, करने के बजाय os.listdir(os.getcwd()), यह करना बेहतर है os.listdir(os.path.curdir)। एक कम फ़ंक्शन कॉल, और यह पोर्टेबल है।

तो, एक फ़ोल्डर में निर्देशिकाओं की सूची प्राप्त करने के लिए, उत्तर को पूरा करने के लिए:

def listdirs(folder):
    return [d for d in os.listdir(folder) if os.path.isdir(os.path.join(folder, d))]

यदि आप पूर्ण पथनाम पसंद करते हैं, तो इस फ़ंक्शन का उपयोग करें:

def listdirs(folder):
    return [
        d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
        if os.path.isdir(d)
    ]

9

यह भी काम करने लगता है (कम से कम लिनक्स पर):

import glob, os
glob.glob('*' + os.path.sep)

1
के लिए +1 glob। यह आपको बहुत सारे कोड, विशेष रूप से पुनरावृत्तियों से बचा सकता है, और UNIX टर्मिनल उपयोग के लिए बहुत अधिक है ( ls)
Gerard

5
Glob.glob ('* *' + os.path.sep) के बजाय आप लिखना चाह सकते हैं [glob.glob ("*" में dir के लिए यदि os.path.isdir (dir)
Eamonn MR

8

बस जोड़ने के लिए कि os.listdir का उपयोग करके () बहुत प्रसंस्करण नहीं लेता है बनाम बहुत सरल os.walk ()। अगला () [1] " । ऐसा इसलिए है क्योंकि os.walk () आंतरिक रूप से os.listdir () का उपयोग करता है। वास्तव में यदि आप उन्हें एक साथ परखें:

>>>> 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

Os.listdir () का फ़िल्टरिंग बहुत तेज़ है।


2
पायथन 3.5 में आना निर्देशिका सामग्री प्राप्त करने का एक तेज़ तरीका है: python.org/dev/peps/pep-0471
foz

1
pep-0471 - scandirपैकेज - PyPon के लिए खुशी से उपलब्ध है। बाद में PyPI पर एक संस्थापित पैकेज के रूप में उपलब्ध है। यह के लिए प्रतिस्थापन प्रदान करता है os.walkऔर os.listdirयह बहुत तेजी से कर रहे हैं।
फोज

6

इसका उपयोग करने के लिए एक बहुत ही सरल और सुरुचिपूर्ण तरीका है:

 import os
 dir_list = os.walk('.').next()[1]
 print dir_list

इस स्क्रिप्ट को उसी फ़ोल्डर में चलाएं जिसके लिए आप फ़ोल्डर नाम चाहते हैं। यह आपको केवल तत्काल फ़ोल्डर का नाम देगा (वह भी फ़ोल्डर्स के पूर्ण पथ के बिना)।


6

सूची समझ का उपयोग करना,

[a for a in os.listdir() if os.path.isdir(a)]

मुझे लगता है कि यह सबसे सरल तरीका है


2

यहाँ एक नौसिखिया होने के नाते मैं अभी तक सीधे टिप्पणी नहीं कर सकता, लेकिन यहाँ एक छोटा सुधार है जिसे मैं : के उत्तर के निम्नलिखित भाग में जोड़ना चाहूंगा :

यदि आप पूर्ण पथनाम पसंद करते हैं, तो इस फ़ंक्शन का उपयोग करें:

def listdirs(folder):  
  return [
    d for d in (os.path.join(folder, d1) for d1 in os.listdir(folder))
    if os.path.isdir(d)
]

उन लोगों के लिए जो अभी भी अजगर <2.4 पर हैं : आंतरिक निर्माण को टपल के बजाय एक सूची बनाने की आवश्यकता है और इसलिए इसे इस तरह पढ़ना चाहिए:

def listdirs(folder):  
  return [
    d for d in [os.path.join(folder, d1) for d1 in os.listdir(folder)]
    if os.path.isdir(d)
  ]

अन्यथा किसी को सिंटैक्स त्रुटि मिलती है।


मुझे पता है कि यह एक समय हो गया है, लेकिन इस पहले उदाहरण ने वास्तव में मेरी मदद की।
इबर रोज

1
आपको एक सिंटैक्स त्रुटि मिलती है क्योंकि आपका संस्करण जनरेटर अभिव्यक्तियों का समर्थन नहीं करता है। इन्हें पायथन 2.4 में पेश किया गया था जबकि पायथन 2.0 के बाद से सूची की समझ उपलब्ध है।
10


1

पूर्ण पथ नामों की सूची के लिए मैं इस संस्करण को यहां अन्य समाधानों के लिए पसंद करता हूं :

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))]

1
scanDir = "abc"
directories = [d for d in os.listdir(scanDir) if os.path.isdir(os.path.join(os.path.abspath(scanDir), d))]

0

एक सुरक्षित विकल्प जो निर्देशिका नहीं होने पर विफल नहीं होता है।

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 []


0

अजगर 3.4 पेश किया pathlib मानक पुस्तकालय में मॉड्यूल किया , जो फाइलसिस्टम रास्तों को संभालने के लिए एक वस्तु उन्मुख दृष्टिकोण प्रदान करता है:

from pathlib import Path

p = Path('./')
[f for f in p.iterdir() if f.is_dir()]

-1
-- 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.