chrisg
chrisg

Reputation: 41705

List Directories and get the name of the Directory

I am trying to get the code to list all the directories in a folder, change directory into that folder and get the name of the current folder. The code I have so far is below and isn't working at the minute. I seem to be getting the parent folder name.

import os

for directories in os.listdir(os.getcwd()): 
    dir = os.path.join('/home/user/workspace', directories)
    os.chdir(dir)
    current = os.path.dirname(dir)
    new = str(current).split("-")[0]
    print new

I also have other files in the folder but I do not want to list them. I have tried the below code but I haven't got it working yet either.

for directories in os.path.isdir(os.listdir(os.getcwd())): 

Can anyone see where I am going wrong?

Thanks

Got it working but it seems a bit round about.

import os
os.chdir('/home/user/workspace')
all_subdirs = [d for d in os.listdir('.') if os.path.isdir(d)]
for dirs in all_subdirs:
    dir = os.path.join('/home/user/workspace', dirs)
    os.chdir(dir)
    current = os.getcwd()
    new = str(current).split("/")[4]
    print new

Upvotes: 87

Views: 233264

Answers (6)

corn3lius
corn3lius

Reputation: 5005

import os
folder = "./topfolder/"
top = os.path.dirname(folder)
for root, dirs, files in os.walk(top, topdown=False):
    for name in dirs:
        print (os.path.join(root, name))

Walk is a good built-in for what you are doing

Upvotes: 27

RichieHindle
RichieHindle

Reputation: 281825

This will print all the subdirectories of the current directory:

print ([name for name in os.listdir(".") if os.path.isdir(name)])

I'm not sure what you're doing with split("-"), but perhaps this code will help you find a solution?

If you want the full pathnames of the directories, use abspath:

print ([os.path.abspath(name) for name in os.listdir(".") if os.path.isdir(name)]) # needs outside parenthesis

Note that these pieces of code will only get the immediate subdirectories. If you want sub-sub-directories and so on, you should use walk as others have suggested.

Upvotes: 110

ChaosPredictor
ChaosPredictor

Reputation: 4081

For New Versions of Python

I liked the answer of @RichieHindle but I add a small fix for it

import os

folder = './my_folder'

sub_folders = [name for name in os.listdir(folder) if os.path.isdir(os.path.join(folder, name))]

print(sub_folders)

otherwise it's not really work for me

Upvotes: 33

Kishan K
Kishan K

Reputation: 811

Slight correction for python3 (same answer as @RichieHindle)

This will print all the subdirectories of the current directory in an array:

print( [name for name in os.listdir(".") if os.path.isdir(name)] )

To make the above simpler to read

for name in os.listdir("."):
    if os.path.isdir(name):
        print(name)

If you want the full pathnames of the directories, use abspath:

print( [os.path.abspath(name) for name in os.listdir(".") if os.path.isdir(name)])

Note that these pieces of code will only get the immediate subdirectories.

Upvotes: 0

meatvest
meatvest

Reputation: 889

You seem to be using Python as if it were the shell. Whenever I've needed to do something like what you're doing, I've used os.walk()

For example, as explained here: [x[0] for x in os.walk(directory)] should give you all of the subdirectories, recursively.

Upvotes: 9

ndim
ndim

Reputation: 37895

Listing the entries in the current directory (for directories in os.listdir(os.getcwd()):) and then interpreting those entries as subdirectories of an entirely different directory (dir = os.path.join('/home/user/workspace', directories)) is one thing that looks fishy.

Upvotes: 4

Related Questions