文件名和路径有问题

时间:2011-09-27 01:21:26

标签: python path filenames

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

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

我的输出来自如此多的输出线,只有少数几个。我这样做了吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:1)

我写的一个小模块,pathfinder,让我更容易(在我看来)找到路径。

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

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