views:

930

answers:

5

Hi,

I am searching for a good way to get relative paths of files and (sub)folders within a specific folder.

For my current approach I am using os.walk(). It is working but it does not seem "pythonic" to me:

myFolder = "myfolder"
fileSet = set() # yes, I need a set()

for root, dirs, files in os.walk(myFolder):
    for fileName in files:
        fileSet.add(root.replace(myFolder, "") + os.sep + fileName)

Any other suggestions?

Thanks

+2  A: 

Thats probably the best way to be honest: you can use glob to go a certain number of layers down, but if you need it to be recursive you have to walk.

jkp
+1  A: 

What you are doing is perfectly right and I think should be done that way, BUT just for the sake of alternative, here is an attempt

import os

def getFiles(myFolder):
    old = os.getcwd()
    os.chdir(myFolder)

    fileSet = set()

    for root, dirs, files in os.walk(""):
        for f in files:
            fileSet.add(os.path.join(root, f))

    os.chdir(old)
    return fileSet
Anurag Uniyal
+3  A: 

I think os.walk is the right choice here.
maybe root.replace(myFolder, "") should change to root.replace(myFolder, "", 1) to avoid potential sth. you know.
If you already get the files and (sub)folders, os.path.commonprefix worth a look too.

sunqiang
Thanks for mentioning the third parameter for replace().
vobject
Also, don't use `+os.sep+`, use `os.path.join`.
S.Lott
@pZy, you are welcome:)[email protected], yes, can't agree with u any more.
sunqiang
+4  A: 

Don't use os.sep. Use os.path.join.

Here's what I've always used.

myFolder = "myfolder"
fileSet = set() 

for root, dirs, files in os.walk(myFolder):
    for fileName in files:
        fileSet.add( os.path.join( root[len(myFolder):], fileName )
S.Lott
+1  A: 

You can also use os.listdir() if you are just searching for an alternative to your solution.

But basically the logic will stay the same: iterate over the files - if directory, iterate through the subdirectory.