[ Python ]递归遍历文件夹,使用生成器返回每个文件名_md 版本

2019-05-07 11:13:01 +08:00
 AILOVEU

贴一段自己写的代码,主要实现以下功能:

  1. 递归遍历源目录( src_path )下的文件,可以用于检测文件
  2. 可以将源目录下的所有文件处理后传到目标目录(det_path)中,即可以对源文件批量处理,将 print 替换成对应方法即可
import os
def dir_walk(src_path,det_path=None):
    if os.path.isdir(src_path):
        if det_path and not os.path.isdir(det_path):
            os.makedirs(det_path)
        for name in os.listdir(src_path):
            _src_path = os.path.join(src_path,name)
            _det_path = det_path and os.path.join(det_path,name)
            yield from dir_walk(_src_path,_det_path)
    if os.path.isfile(src_path):
        yield src_path,det_path
for i,_ in dir_walk('/home'):
    print(i)

主要有几个疑问,大家帮忙试着解答下哈:

  1. 代码的执行效率如何,递归时使用 yield 会不会没有发挥 yield 的作用
  2. yield from 和递归一起使用感觉怪怪的,这是我试出来的,这样写竟然可以用,谁帮忙解释下怎么的语法啊
  3. 为了让方法可以同时满足我上面说的两种功能,所以加的第二个参数默认为 None,然后方法里一些判断,当然这样就降低了代码的效率,有更好的解决办法吗?
2582 次点击
所在节点    Python
17 条回复
AILOVEU
2019-05-07 11:20:53 +08:00
这个帖子上去啊
neoblackcap
2019-05-07 11:29:34 +08:00
os.walk 有什么满足不了吗?
shuax
2019-05-07 12:02:23 +08:00
过早优化是万恶之源。能用就行
Abbeyok
2019-05-07 12:09:53 +08:00
递归就是坑坑坑坑
AILOVEU
2019-05-07 12:21:37 +08:00
@neoblackcap 不能复制到新的文件夹下,它只能遍历
liukrystal
2019-05-07 12:43:49 +08:00
为什么不用 os.walk()而是自己造轮子...
jeadong
2019-05-07 12:52:27 +08:00
知道 dir 命令嚒
lc1450
2019-05-07 13:20:14 +08:00
python3.5 及以上用 os.scandir 会更快一点
AILOVEU
2019-05-07 13:24:49 +08:00
@liukrystal 不光是遍历,主要是第二个参数,可以用于复制文件等
AILOVEU
2019-05-07 13:29:19 +08:00
@jeadong 什么啊?
AILOVEU
2019-05-07 13:36:43 +08:00
@lc1450 是指替换 os.listdir 吧
casparchen
2019-05-07 13:39:37 +08:00
没看懂其中有什么是 os.walk 不能做,而这段代码能做的
lc1450
2019-05-07 13:39:45 +08:00
@AILOVEU 和 os.walk()差不多, 具体可以看官方文档
AILOVEU
2019-05-07 13:40:33 +08:00
如果不用 yield,递归是很容易实现的,因为最近学到了,所以就想把它包装成一个方法; os.walk 也可以勉强完成处理后复制文件的功能,但用起来会很别扭
AILOVEU
2019-05-07 13:41:55 +08:00
@lc1450 Using scandir() instead of listdir() can significantly increase the performance of code that also needs file type or file attribute information
lc1450
2019-05-07 13:57:49 +08:00
@AILOVEU
不好意看错了 os.walk 文档下面解释 Changed in version 3.5: This function now calls os.scandir() instead of os.listdir(), making it faster by reducing the number of calls to os.stat().

scandir 和 walk 一般都直接用来迭代目录,还以为这俩是一样的
AILOVEU
2019-05-07 14:07:02 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561728

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX