【问题标题】:Filenames and paths trouble文件名和路径问题
【发布时间】:2011-09-27 01:21:25
【问题描述】:

以下示例“遍历”一个目录,打印所有文件的名称,并在所有目录上递归调用自身。

import os
def walk(dir):
    for name in os.listdir(dir):
        path = os.path.join(dir,name)
        if os.path.isfile(path):
            print path
        else:
            walk1(path)

os.path.join` takes a directory and a file name and joins them into a complete path.

我的练习:修改walk,使它不打印文件名,而是返回一个名称列表。

有人能解释一下这个函数每行做了什么吗?我有一个好主意,但是当它到达这条线时:else: walk(path),这让我大吃一惊,因为没有解释它在做什么。对于这个练习,我能想到的将其更改为列表的唯一方法是:

def walk1(dir):
    res = []
    for name in os.listdir(dir):
        path = os.path.join(dir,name)
        if os.path.isfile(path):
            res.append(path)
        else:
            walk1(path)
    return res

我的输出从很多输出行变成了仅有的几行。我做对了吗?

【问题讨论】:

    标签: python path filenames


    【解决方案1】:

    这是一个带注释的版本,对递归进行了小幅修复。

    def walk1(dir):
        res = []
        # for all entries in the folder,
        for name in os.listdir(dir):
            # compute the path relative to `dir`
            path = os.path.join(dir,name)
            # include entries recursively.
            if os.path.isfile(path):
                # the path points to a file, save it.
                res.append(path)
            else:
                # the path points to a directory, so we need
                # to fetch the list of entries in there too.
                res.extend(walk1(path))
        # produce all entries at once.
        return res
    

    【讨论】:

    • 另外,下一个练习将讨论 os 中的一个名为 walk 的函数,但是我需要阅读相关文档;我需要打印给定目录及其子目录中的文件名。如果我解释正确,那不也是 res.extend 吗?
    【解决方案2】:

    您需要将递归的结果添加到已有的结果中。

    【讨论】:

    • 我刚刚意识到,walk(path) 和我在这里定义的函数不是同一个递归>
    【解决方案3】:

    我写的一个小模块,pathfinder,让查找路径变得更容易(无论如何我认为)。

    from pathfinder import pathfind
    paths = pathfind(a_dir, just_files=True)
    

    它只是 os.walk 之上的一个层,但消除了一些围绕它的混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多