รับรายการของไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีปัจจุบัน


558

มีวิธีการส่งคืนรายการของไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีปัจจุบันใน Python หรือไม่?

ฉันรู้ว่าคุณสามารถทำได้ด้วยไฟล์ แต่ฉันต้องได้รับรายชื่อของไดเรกทอรีแทน


คำตอบ:


602

คุณหมายถึงไดเรกทอรีย่อยทันทีหรือทุกไดเรกทอรีลงต้นไม้หรือไม่

คุณสามารถใช้os.walkวิธีนี้:

os.walk(directory)

จะให้ผลเป็น tuple สำหรับแต่ละไดเรกทอรีย่อย รายการแรกใน 3-tuple เป็นชื่อไดเรกทอรีดังนั้น

[x[0] for x in os.walk(directory)]

ควรให้ไดเรกทอรีย่อยทั้งหมดของคุณซ้ำ ๆ

โปรดทราบว่ารายการที่สองใน tuple คือรายการของไดเรกทอรีลูกของรายการในตำแหน่งแรกดังนั้นคุณสามารถใช้สิ่งนี้แทน แต่ไม่น่าจะช่วยคุณได้มากนัก

อย่างไรก็ตามคุณสามารถใช้เพื่อให้ไดเรกทอรีลูกทันที:

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

หรือดูวิธีแก้ไขปัญหาอื่น ๆ ที่โพสต์แล้วโดยใช้os.listdirและos.path.isdirรวมถึงที่ " วิธีรับไดเรกทอรีย่อยทั้งหมดใน Python "


7
ฉันคิดว่า os.walk คืนค่าอเนกประสงค์ (root, dirs, files) ซึ่งหมายความว่า dirs มีหลายรายการซ้ำ มีวิธีที่มีประสิทธิภาพมากขึ้นที่ recurses ผ่านไดเรกทอรี?
mathtick

22
ห้ามใช้os.walk('.').next()[1]หรือos.walk('.').__next__()[1]โดยตรง แต่ให้ใช้ในตัวฟังก์ชั่นnext()ที่สามารถใช้ได้ทั้งในหลาม 2 (ดู doc)และงูหลาม 3 (ดู doc) ตัวอย่างเช่นnext(os.walk('.'))[1].
Lucio Paiva

1
@Lucio เหตุใดการใช้os.walk('.').next()[1]โดยตรงจึงไม่ดี
wisbucky

8
@wiscucky มันเป็นวิธีปฏิบัติที่ไม่ดีเพราะiteraror.__next__()เป็นวิธีการภายในและiterator.next()การใช้งานควรเปลี่ยนไปใช้ในตัวnext()ตาม PEP-3114 ดูPEP-3114ซึ่งได้รับการอนุมัติในปี 2007
Lucio Paiva

16
สำหรับทุกคนที่กังวลเกี่ยวกับความแตกต่างด้านประสิทธิภาพระหว่างos.walkและโซลูชันos.listdir+ os.path.isdir: ฉันเพิ่งทดสอบในไดเรกทอรีที่มี 10,000 ไดเรกทอรีย่อย (มีไฟล์นับล้านในลำดับชั้นด้านล่าง) และความแตกต่างด้านประสิทธิภาพนั้นเล็กน้อย os.walk: "10 ลูป, ดีที่สุด 3: 44.6 msec ต่อลูป" และos.listdir+ os.path.isdir: "10 ลูป, ดีที่สุด 3: 45.1 msec ต่อลูป"
kevinmicke

165
import os

d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]

5
โปรดทราบว่าในวิธีการนี้คุณต้องดูแล abspath-problems หากไม่ดำเนินการใน '.'
daspostloch

4
เพียงแค่หัวขึ้นถ้าคุณไม่ได้ใช้ CWD นี้ ( '') นี้จะไม่ทำงานจนกว่าคุณทำos.path.joinบนoเพื่อให้ได้เส้นทางแบบเต็มมิฉะนั้นisdir(0)จะกลับเท็จ
เจมส์แม็คมาน

5
ดูเหมือนว่าโพสต์นั้นได้รับการอัปเดตพร้อมการแก้ไขสำหรับปัญหาทั้งสองที่กล่าวถึงข้างต้น
cgmb

1
เพื่อหลีกเลี่ยงการโทรos.path.joinสองครั้งแรกคุณสามารถเข้าร่วมแล้วกรองรายการโดยใช้os.path.isdir: filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
quant_dev

155

คุณสามารถใช้ glob.glob

from glob import glob
glob("/path/to/directory/*/")

อย่าลืมต่อท้ายหลังจากที่/*


ดี ง่าย เฉพาะมันทิ้ง/
ร่องรอย

9
หากคุณไม่สามารถสันนิษฐานได้ว่า/เป็นตัวแยกโฟลเดอร์ให้ทำดังนี้:glob(os.path.join(path_to_directory, "*", ""))
juanmirocks

1
สิ่งนี้ใช้ไม่ได้กับไดเรกทอรีย่อย! หากต้องการใช้ glob ต่อไปนี้เป็นคำตอบที่สมบูรณ์: ใช้ Glob () เพื่อค้นหาไฟล์ซ้ำใน Python หรือไม่
poppie

1
เพื่อทำให้ glob ซ้ำคุณสามารถเพิ่มอาร์กิวเมนต์ต่อไปนี้recursive=True
JacoSolari

102

ดีกว่าด้านบนเนื่องจากคุณไม่ต้องการ os.path.join () หลายอันและคุณจะได้รับพา ธ แบบเต็มโดยตรง (ถ้าคุณต้องการ) คุณสามารถทำได้ในPython 3.5ขึ้นไป

subfolders = [ f.path for f in os.scandir(folder) if f.is_dir() ]

สิ่งนี้จะให้เส้นทางที่สมบูรณ์ไปยังไดเรกทอรีย่อย หากคุณต้องการชื่อของการใช้ไดเรกทอรีย่อยf.nameแทนf.path

https://docs.python.org/3/library/os.html#os.scandir


OT เล็กน้อย: ในกรณีที่คุณต้องการโฟลเดอร์ย่อยทั้งหมดซ้ำและ / หรือไฟล์ทั้งหมดซ้ำเรียกดูฟังก์ชั่นนี้ที่เร็วกว่าos.walk& globและจะส่งกลับรายการโฟลเดอร์ย่อยทั้งหมดรวมถึงไฟล์ทั้งหมดในโฟลเดอร์ย่อย (ย่อย): https://stackoverflow.com/a/59803793/2441026

ในกรณีที่คุณต้องการเฉพาะโฟลเดอร์ย่อยทั้งหมดซ้ำ :

def fast_scandir(dirname):
    subfolders= [f.path for f in os.scandir(dirname) if f.is_dir()]
    for dirname in list(subfolders):
        subfolders.extend(fast_scandir(dirname))
    return subfolders

ส่งคืนรายการของโฟลเดอร์ย่อยทั้งหมดที่มีเส้นทางแบบเต็ม สิ่งนี้จะเร็วกว่าos.walkและเร็วกว่าglobมาก


การวิเคราะห์ฟังก์ชั่นทั้งหมด

TL; DR:
- ถ้าคุณต้องการที่จะได้รับทั้งหมดทันทีos.scandirไดเรกทอรีย่อยสำหรับการใช้งานโฟลเดอร์
- หากคุณต้องการได้รับไดเรกทอรีย่อยทั้งหมดแม้แต่ที่ซ้อนกันให้ใช้os.walkหรือ - เร็วขึ้นเล็กน้อย - fast_scandirฟังก์ชั่นด้านบน
- การใช้งานไม่เคยสำหรับไดเรกทอรีย่อยระดับบนสุดเท่านั้นที่จะสามารถหลายร้อยครั้งช้ากว่าos.walk (!)os.scandir

  • หากคุณเรียกใช้รหัสด้านล่างตรวจสอบให้แน่ใจว่าได้เรียกใช้ครั้งเดียวเพื่อให้ระบบปฏิบัติการของคุณเข้าถึงโฟลเดอร์ทิ้งผลลัพธ์และรันการทดสอบมิฉะนั้นผลลัพธ์จะถูกไข
  • คุณอาจต้องการผสมผสานการเรียกใช้ฟังก์ชัน แต่ฉันทดสอบแล้วและมันก็ไม่สำคัญ
  • ตัวอย่างทั้งหมดจะให้เส้นทางแบบเต็มไปยังโฟลเดอร์ ตัวอย่าง pathlib เป็นวัตถุ Path (Windows)
  • องค์ประกอบแรกของos.walkจะเป็นโฟลเดอร์ฐาน ดังนั้นคุณจะไม่ได้รับเฉพาะไดเรกทอรีย่อย คุณสามารถใช้fu.pop(0)เพื่อลบมัน
  • ไม่มีผลที่จะใช้การเรียงลำดับตามธรรมชาติ ซึ่งหมายความว่าผลลัพธ์จะถูกจัดเรียงเช่นนี้: 1, 10, 2 หากต้องการรับการจัดเรียงแบบธรรมชาติ (1, 2, 10) โปรดดูที่https://stackoverflow.com/a/48030307/2441026


ผลลัพธ์ :

os.scandir      took   1 ms. Found dirs: 439
os.walk         took 463 ms. Found dirs: 441 -> it found the nested one + base folder.
glob.glob       took  20 ms. Found dirs: 439
pathlib.iterdir took  18 ms. Found dirs: 439
os.listdir      took  18 ms. Found dirs: 439

ทดสอบกับ W7x64, Python 3.8.1

# -*- coding: utf-8 -*-
# Python 3


import time
import os
from glob import glob
from pathlib import Path


directory = r"<insert_folder>"
RUNS = 1


def run_os_walk():
    a = time.time_ns()
    for i in range(RUNS):
        fu = [x[0] for x in os.walk(directory)]
    print(f"os.walk\t\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_glob():
    a = time.time_ns()
    for i in range(RUNS):
        fu = glob(directory + "/*/")
    print(f"glob.glob\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_pathlib_iterdir():
    a = time.time_ns()
    for i in range(RUNS):
        dirname = Path(directory)
        fu = [f for f in dirname.iterdir() if f.is_dir()]
    print(f"pathlib.iterdir\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_os_listdir():
    a = time.time_ns()
    for i in range(RUNS):
        dirname = Path(directory)
        fu = [os.path.join(directory, o) for o in os.listdir(directory) if os.path.isdir(os.path.join(directory, o))]
    print(f"os.listdir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_os_scandir():
    a = time.time_ns()
    for i in range(RUNS):
        fu = [f.path for f in os.scandir(directory) if f.is_dir()]
    print(f"os.scandir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms.\tFound dirs: {len(fu)}")


if __name__ == '__main__':
    run_os_scandir()
    run_os_walk()
    run_glob()
    run_pathlib_iterdir()
    run_os_listdir()

35

หากคุณต้องการโซลูชันแบบเรียกซ้ำที่จะค้นหาไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีย่อยให้ใช้ walk ตามที่เสนอมาก่อน

หากคุณต้องการเพียงไดเรกทอรีย่อยของไดเรกทอรีปัจจุบันให้รวมos.listdirกับos.path.isdir




19

คุณสามารถรับรายการไดเรกทอรีย่อย (และไฟล์) ใน Python 2.7 ได้โดยใช้ os.listdir (พา ธ )

import os
os.listdir(path)  # list of subdirectories and files

59
รวมถึงไฟล์ด้วย
Tarnay Kálmán

2
ชื่อกำลังสับสนเนื่องจาก 'dir' ไม่ได้อ้างถึงวัตถุที่สร้างรายการ แต่หมายถึงไดเรกทอรีคอนเทนเนอร์ โปรดตรวจสอบคำตอบเดียวของคุณสำหรับผู้เริ่มต้นมันน่าดึงดูดมากที่จะเลือกพวกเขา
Titou

4
ระวังos.listdirรายการเนื้อหาของไดเรกทอรีรวมถึงไฟล์
guneysus

13

รายการออกไดเรกทอรีเท่านั้น

print("\nWe are listing out only the directories in current directory -")
directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir))
print(directories_in_curdir)

รายการออกไฟล์เท่านั้นในไดเรกทอรีปัจจุบัน

files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)

2
ไม่ทำงานบน mac OS ฉันคิดว่าปัญหาคือว่า os.listdir จะส่งกลับเฉพาะชื่อของไดเรกทอรีและไม่ใช่เส้นทางแบบเต็ม แต่ os.path.isdir จะคืนค่า True ถ้าเส้นทางแบบเต็มเป็นไดเรกทอรี
denson

สิ่งนี้ใช้ได้นอกไดเรกทอรีปัจจุบันหากคุณแก้ไขบรรทัดเล็กน้อย: subdirs = filter (os.path.isdir, [os.path.join (dir, x) สำหรับ x ใน os.listdir (dir)]
RLC

12

งูหลาม 3.4 แนะนำโมดูลเข้าไปในห้องสมุดมาตรฐานที่ให้บริการเชิงวัตถุวิธีการเส้นทางการจัดการระบบแฟ้ม:pathlib

from pathlib import Path

p = Path('./')

# List comprehension
[f for f in p.iterdir() if f.is_dir()]

# The trailing slash to glob indicated directories
# This will also include the current directory '.'
list(p.glob('**/'))

Pathlib ยังมีอยู่ใน Python 2.7 ผ่านโมดูล pathlib2 บน PyPi


ย้ำกว่ารายชื่อของไดเรกทอรีที่นี่เป็นดีไวยากรณ์สะอาดfor f in filter(Path.is_dir, p.iterdir()):
ไบรอันแมลงสาบ

11

เนื่องจากฉันเจอปัญหานี้โดยใช้ Python 3.4 และ Windows UNC path นี่เป็นตัวแปรสำหรับสภาพแวดล้อมนี้:

from pathlib import WindowsPath

def SubDirPath (d):
    return [f for f in d.iterdir() if f.is_dir()]

subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$'))
print(subdirs)

Pathlib ใหม่ใน Python 3.4 และทำให้การทำงานกับพา ธ ภายใต้ OS ต่าง ๆ ง่ายขึ้นมาก: https://docs.python.org/3.4/library/pathlib.html


10

แม้ว่าคำถามนี้จะตอบมานานแล้ว ฉันต้องการแนะนำให้ใช้pathlibโมดูลเนื่องจากนี่เป็นวิธีที่มีประสิทธิภาพในการทำงานบน Windows และ Unix OS

ดังนั้นเพื่อรับเส้นทางทั้งหมดในไดเรกทอรีเฉพาะรวมถึงไดเรกทอรีย่อย:

from pathlib import Path
paths = list(Path('myhomefolder', 'folder').glob('**/*.txt'))

# all sorts of operations
file = paths[0]
file.name
file.stem
file.parent
file.suffix

เป็นต้น


9

ขอบคุณสำหรับเคล็ดลับพวก ฉันพบปัญหาเกี่ยวกับซอฟต์ลิงค์ Softlinks? เราไม่ต้องการลิงก์ที่อ่อนนุ่มสำหรับ stinkin! ดังนั้น...

สิ่งนี้แสดงผลเฉพาะ dirs ไม่ใช่ softlink:

>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']

1
มีอะไรที่[x[0] for x in inf]เรียกว่าไพ ธ อนดังนั้นฉันจึงสามารถค้นหามันได้?
shinzou

2
@ shinzou นั่นเป็นรายการความเข้าใจ สุดยอดประโยชน์ ยังค้นหาความเข้าใจ พ.ร.บ.
KurtB

9

คัดลอกวางได้ง่ายในipython:

import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))

ผลลัพธ์จากprint(folders):

['folderA', 'folderB']

2
X ในกรณีนี้คืออะไร?
Abhishek Parikh

1
@AbhishekParikh xเป็นรายการจากรายการที่สร้างโดยos.listdir(d)เพราะlistdirจะส่งคืนไฟล์และโฟลเดอร์ที่เขาใช้filterคำสั่งด้วยos.path.isdirเพื่อกรองไฟล์ใด ๆ ออกจากรายการ
James Burke

8

นี่คือวิธีที่ฉันทำ

    import os
    for x in os.listdir(os.getcwd()):
        if os.path.isdir(x):
            print(x)

มันใช้งานไม่ได้ ฉันเดาใน x คุณต้องให้เส้นทางที่สมบูรณ์เพื่อตรวจสอบการใช้ isdir ()
niranjan patidar

คุณอาจมีปัญหากับ os.getcwd (); โดยพื้นฐานแล้วสิ่งที่คุณสามารถทำได้คือคุณจะได้รับเส้นทางที่แน่นอนและใช้สิ่งนั้นแทน dir = os.path.dirname (os.path.abspath ( ไฟล์ ))
Mujeeb Ishaque

ใช้ระบบปฏิบัติการ pat.join () ทำงานให้ฉัน เพราะมันช่วยให้ได้เส้นทางเต็มของไดเรกทอรีย่อย
niranjan patidar

7

นี่คือฟังก์ชั่นพื้นฐานสองอย่างที่อ้างอิงจากตัวอย่างของ @Blair Conrad -

import os

def get_subdirs(dir):
    "Get a list of immediate subdirectories"
    return next(os.walk(dir))[1]

def get_subfiles(dir):
    "Get a list of immediate subfiles"
    return next(os.walk(dir))[2]

6

สร้างตามโซลูชันของ Eli Bendersky ใช้ตัวอย่างต่อไปนี้:

import os
test_directory = <your_directory>
for child in os.listdir(test_directory):
    test_path = os.path.join(test_directory, child)
    if os.path.isdir(test_path):
        print test_path
        # Do stuff to the directory "test_path"

โดยที่<your_directory>เป็นพา ธ ไปยังไดเร็กทอรีที่คุณต้องการสำรวจ


5

ด้วยเส้นทางที่เต็มรูปแบบและการบัญชีสำหรับเส้นทางที่เป็นอยู่., .., \\, ..\\..\\subfolderฯลฯ :

import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])

4

ดูเหมือนว่าคำตอบนี้จะไม่มีอยู่แล้ว

directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]

7
นี่จะส่งคืนรายการว่างเสมอหากคุณกำลังค้นหาสิ่งอื่นนอกเหนือจากไดเรกทอรีการทำงานปัจจุบันซึ่งเป็นเทคนิคที่ OP ต้องการทำ แต่ไม่สามารถนำกลับมาใช้ใหม่ได้
ochawkeye

2
ไดเรกทอรี = [x สำหรับ x ใน os.listdir (localDir) ถ้า os.path.isdir (localDir + x)
Poonam

3

ผมเคยมีคำถามที่คล้ายกันเร็ว ๆ นี้และผมพบว่าคำตอบที่ดีที่สุดสำหรับการหลาม 3.6 (เป็น havlock ผู้ใช้ที่เพิ่มขึ้น) os.scandirคือการใช้งาน เนื่องจากดูเหมือนว่าไม่มีวิธีใช้ฉันจะเพิ่มของฉันเอง ก่อนอื่นโซลูชันที่ไม่เรียกซ้ำที่แสดงรายการไดเรกทอรีย่อยโดยตรงภายใต้ไดเรกทอรีราก

def get_dirlist(rootdir):

    dirlist = []

    with os.scandir(rootdir) as rit:
        for entry in rit:
            if not entry.name.startswith('.') and entry.is_dir():
                dirlist.append(entry.path)

    dirlist.sort() # Optional, in case you want sorted directory names
    return dirlist

เวอร์ชันเรียกซ้ำจะมีลักษณะเช่นนี้:

def get_dirlist(rootdir):

    dirlist = []

    with os.scandir(rootdir) as rit:
        for entry in rit:
            if not entry.name.startswith('.') and entry.is_dir():
                dirlist.append(entry.path)
                dirlist += get_dirlist(entry.path)

    dirlist.sort() # Optional, in case you want sorted directory names
    return dirlist

โปรดทราบว่าentry.pathwields พา ธ สัมบูรณ์ไปยังไดเร็กทอรีย่อย ในกรณีที่คุณต้องการชื่อโฟลเดอร์คุณสามารถใช้entry.nameแทน อ้างถึงos.DirEntryสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับentryวัตถุ


อันที่จริงวิธีการเขียนนี้จะไม่ทำงานบน 3.5 เพียง 3.6 หากต้องการใช้งาน 3.5 คุณจำเป็นต้องลบตัวจัดการบริบท - ดูstackoverflow.com/questions/41401417/…
havlock

สิ่งนี้ถูกต้อง ฉันสาบานได้ว่าฉันอ่านที่ไหนสักแห่งที่ผู้จัดการบริบทใช้งานใน 3.5 แต่ดูเหมือนว่าฉันผิด
Alberto A

1

ใช้ฟังก์ชันตัวกรองos.path.isdirเหนือos.listdir() บางสิ่งเช่นนี้filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])


1

นี่จะแสดงรายการไดเรกทอรีย่อยทั้งหมดลงในแผนผังไฟล์

import pathlib


def list_dir(dir):
    path = pathlib.Path(dir)
    dir = []
    try:
        for item in path.iterdir():
            if item.is_dir():
                dir.append(item)
                dir = dir + list_dir(item)
        return dir
    except FileNotFoundError:
        print('Invalid directory')

pathlib ใหม่ในเวอร์ชัน 3.4


1

ฟังก์ชั่นเพื่อกลับรายการของไดเรกทอรีย่อยทั้งหมดภายในเส้นทางไฟล์ที่กำหนด จะค้นหาทรีไฟล์ทั้งหมด

import os

def get_sub_directory_paths(start_directory, sub_directories):
    """
    This method iterates through all subdirectory paths of a given 
    directory to collect all directory paths.

    :param start_directory: The starting directory path.
    :param sub_directories: A List that all subdirectory paths will be 
        stored to.
    :return: A List of all sub-directory paths.
    """

    for item in os.listdir(start_directory):
        full_path = os.path.join(start_directory, item)

        if os.path.isdir(full_path):
            sub_directories.append(full_path)

            # Recursive call to search through all subdirectories.
            get_sub_directory_paths(full_path, sub_directories)

return sub_directories

1

เราสามารถรับรายชื่อของโฟลเดอร์ทั้งหมดโดยใช้ os.walk ()

import os

path = os.getcwd()

pathObject = os.walk(path)

นี้ pathObjectเป็นวัตถุและเราจะได้รับอาร์เรย์โดย

arr = [x for x in pathObject]

arr is of type [('current directory', [array of folder in current directory], [files in current directory]),('subdirectory', [array of folder in subdirectory], [files in subdirectory]) ....]

เราสามารถรับรายชื่อของไดเรกทอรีย่อยทั้งหมดโดยทำซ้ำผ่าน arrและพิมพ์อาร์เรย์กลาง

for i in arr:
   for j in i[1]:
      print(j)

สิ่งนี้จะพิมพ์ไดเรกทอรีย่อยทั้งหมด

ในการรับไฟล์ทั้งหมด:

for i in arr:
   for j in i[2]:
      print(i[0] + "/" + j)

0

ฟังก์ชั่นนี้กับผู้ปกครองที่กำหนดdirectoryiterates ทุกdirectoriesซ้ำและprintsทั้งหมดfilenamesที่มันพบภายใน มีประโยชน์มากเกินไป

import os

def printDirectoryFiles(directory):
   for filename in os.listdir(directory):  
        full_path=os.path.join(directory, filename)
        if not os.path.isdir(full_path): 
            print( full_path + "\n")


def checkFolders(directory):

    dir_list = next(os.walk(directory))[1]

    #print(dir_list)

    for dir in dir_list:           
        print(dir)
        checkFolders(directory +"/"+ dir) 

    printDirectoryFiles(directory)       

main_dir="C:/Users/S0082448/Desktop/carpeta1"

checkFolders(main_dir)


input("Press enter to exit ;")

0

ด้วยการเข้าร่วมโซลูชั่นที่หลากหลายจากที่นี่นี่คือสิ่งที่ฉันลงเอยด้วยการใช้:

import os
import glob

def list_dirs(path):
    return [os.path.basename(x) for x in filter(
        os.path.isdir, glob.glob(os.path.join(path, '*')))]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.