Python:os.walk()维护层次结构

时间:2011-12-19 10:57:07

标签: python recursion directory

我正在尝试使用pythons os.walk来从任意目录结构中传输文件:

matches = []
for root, dirnames, filenames in os.walk(path):
    for filename in fnmatch.filter(filenames, name):
        matches.append(os.path.join(root, filename))

print matches

这很好地覆盖了所有文件,但我还想能够维护实际的文件夹结构,即我想通过子文件夹遍历子文件夹,所以我实际上知道什么文件名属于哪个子文件夹。这是可能的os.walk或我将不得不推出自己的功能?

澄清我的问题:我想创建一个我解析的目录的程序内部树,所以我想以递归的方式实际解析目录树,这样我就会遇到每个子目录和文件一次,即:

伪代码:

def createAndParseSubDir(path):
    ret = []
    files = glob(path)
    for file in files:
        if isDir(file):
            ret.append(createAndParseSubDir(file))
        else:
            ret.append(file)

    return ret

hierarchy = createAndParseSubDir(myRoot)

修改 我最终使用类似上面的伪代码的递归函数来确保文件/目录以树的方式解析。

2 个答案:

答案 0 :(得分:0)

您已经拥有此信息,您只是没有使用它:

for root, dirnames, filenames in os.walk(path):
    # current folder: root
    # list of filenames in that folder: filenames
    # list of subdirectories in that folder: dirnames
    for filename in fnmatch.filter(filenames, name):
        matches.append(os.path.join(root, filename))
        #          current folder ----^       ^----- current file

答案 1 :(得分:0)

可能您可以存储在字典中而不是列表中。试试这个,看看它是否适合你的账单

matches = {}
for root, dirnames, filenames in os.walk(path):
    for filename in fnmatch.filter(filenames, name):
        matches.setdefault(root,[]).append(os.path.join(root, filename))