python2目录递归问题

shojnhv 发布于 2017/01/17 19:38
阅读 268
收藏 0
想用Python2做这样一个函数。给定一个路径sourcedir,给定一个子路径级别数N,自动搜索出sourcedir下面到N层子路径的所有子路径。 例如下列路径结构 /a/b1/c1 /a/b2/c2 /a/b3/c3/d3 /a/b4/c4/d4/e4 /a/b5/c5/d5/e5/f5 sourcedir="/a" 当N=1时,函数返回["b1", "b2", "b3", "b4", "b5"] 当N=2时,函数返回["b1/c1", "b2/c2", "b3/c3", "b4/c4", "b5/c5"] 当N=3时,函数返回["b3/c3/d3", "b4/d4/c4", "b5/c5/d5"] 当N=4时,函数返回["b4/c4/d4/e4", "b5/c5/d5/e5"] 当N=5时,函数返回["b5/c5/d5/e5/f5"] 当N>=6时,函数返回[ ] 想了很久都没有实现。有大神可以帮忙实现么? 多谢了 我原来的思路是先遍历sourcedir下所有的子路径,然后再从里面选择需要层数的子路径返回。但是当sourcedir下面有很多子路径和文件时。这种方法慢的要死。需要一种递归方法,只递归N级子路径就停止才行。这个方法想了很久都没有做出来。需要高手帮忙。
加载中
1
一碗粥
一碗粥
In [23]: ret = []; N = 2
    ...: for parent, dirs, files in os.walk('./a'):
    ...:     if parent.count("/") == N:
    ...:         if len(dirs) > 0:
    ...:             ret.extend([os.path.join(parent, d) for d in dirs])
    ...:         if len(files) > 0:
    ...:             ret.extend([os.path.join(parent, f) for f in files])
    ...:         continue
    ...: print ret



一碗粥
一碗粥
回复 @shojnhv : 我8核CPU, 16G内存, 利用parallel遍历ubuntu根目录, 大概10秒钟. 不论多深的目录.
一碗粥
一碗粥
回复 @shojnhv : 试了一下parallel, 速度是快很多. 还有一个思路, 就是如果你需要遍历的内容不会时刻变化, 可以做一下数据持久化.只需要第一次遍历一遍后, 以后只需要查询数据库. 然后可以定期更新.
一碗粥
一碗粥
回复 @shojnhv : 你可以试着用Parallel做一下.
s
shojnhv
非常感谢。不过这段代码有个执行效率问题。就是他要遍历所有sourcedir下面的子路径才结束。如果sourcedir下面有很多子路径,应该会很慢。
0
天台选手
天台选手
首先说一下我没有仔细想,大概觉得N可以做一个循环来控制,显示路径其实就是显示文件夹。
0
M
MikeDrew

如果想要递归n级,需要用一个参数来代表n, 类似这样

def digui(n, other_params):

    if n > 10:

        return something

    else:

        return digui(n+1, other_params)

digui(1, other_params)

怎么贴代码,不会贴代码。

你可以看到,带有这种固定n级递归的情况,使用递归写很复杂,比较适合用循环写法,另外python的递归没有优化,不如循环。建议用python就用循环,不建议用递归。

s
shojnhv
同意。应该用循环比较好
返回顶部
顶部