【问题标题】:Python: os.walk() maintain hierarchyPython:os.walk() 维护层次结构
【发布时间】:2012-01-23 12:31:57
【问题描述】:

我正在尝试使用 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)

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

【问题讨论】:

标签: python recursion directory


【解决方案1】:

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

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

【讨论】:

  • 我知道我有文件夹名称,更多的是关于步行顺序。基本上我不仅想要路径,还想从中创建我自己的树。
【解决方案2】:

也许您可以存储在字典而不是列表中。试试这个,看看它是否符合您的要求

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多