美文网首页
Python目录遍历 os.walk

Python目录遍历 os.walk

作者: 躺在稻田里的小白菜 | 来源:发表于2018-04-28 17:03 被阅读0次

    一. 概述

    • os.walk() 方法用于通过在目录树中游走,输出在目录中的文件名,以及子目录名。
    • os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
    • 在Unix,Windows中有效。

    二. 函数介绍

    os.walk的参数如下:

    os.walk(top, topdown=True, onerror=None, followlinks=False)
    

    其中:

    • top是要遍历的目录。
    • topdown是代表要从目录顶层到底层遍历,还是从底层向上遍历。
    • onerror可以用来设置当便利出现错误的处理函数(该函数接受一个OSError的实例作为参数),设置为空则不作处理。
    • followlinks表示是否要跟随目录下的链接去继续遍历,要注意的是,os.walk不会记录已经遍历的目录,所以跟随链接遍历的话有可能一直循环调用下去。

    os.walk返回的是一个3个元素的元组 (root, dirs, files) ,分别表示遍历的路径名,该路径下的目录列表和该路径下文件列表。注意目录列表和文件列表不是具体路径,需要具体路径(从root开始的路径)的话可以用 os.path.join(root,dirs)os.path.join(root,files)

    三. 例子

    假设现在存在如下的文件和目录结构:

    ➜  test_os_walk git:(master) ✗ tree
    .
    ├── a.py
    ├── b.py
    ├── c.py
    ├── dir1
    │   ├── dir4
    │   │   ├── g.py
    │   │   └── h.py
    │   ├── dirx
    │   │   ├── diry
    │   │   │   └── k.py
    │   │   └── z.py
    │   ├── e.py
    │   ├── f.py
    │   └── g.py
    ├── dir2
    │   ├── dira
    │   │   └── dirb
    │   │       └── dirc
    │   │           └── aha.py
    │   ├── k.py
    │   ├── l.py
    │   └── m.py
    └── dir3
        ├── dir5
        │   └── z.py
        ├── x.py
        └── y.py
    
    10 directories, 17 files
    
    
    测试topdown

    当我用 os.walk 遍历这个目录时,程序和输出如下:

    import os
    
    path = '/Users/nisen/Projects/python_advanced_class/test/test_os_walk'
    
    for root, dirs, files in os.walk(path, True):
        print 'root: %s' % root
        print 'dirs: %s' % dirs
        print 'files: %s' % files
        print ''
    
    

    结果如下,从root的路径可以看出遍历是自上而下的:

    ➜  test git:(master) ✗ python test11.py
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk
    dirs: ['dir1', 'dir2', 'dir3']
    files: ['a.py', 'b.py', 'c.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1
    dirs: ['dir4', 'dirx']
    files: ['e.py', 'f.py', 'g.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dir4
    dirs: []
    files: ['g.py', 'h.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx
    dirs: ['diry']
    files: ['z.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx/diry
    dirs: []
    files: ['k.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2
    dirs: ['dira']
    files: ['k.py', 'l.py', 'm.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira
    dirs: ['dirb']
    files: []
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb
    dirs: ['dirc']
    files: []
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb/dirc
    dirs: []
    files: ['aha.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3
    dirs: ['dir5']
    files: ['x.py', 'y.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3/dir5
    dirs: []
    files: ['z.py']
    
    

    而当设置os.walk的topdown为False时,结果如下, 可以看出他是自上而下遍历的:

    ➜  test git:(master) ✗ python test11.py
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dir4
    dirs: []
    files: ['g.py', 'h.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx/diry
    dirs: []
    files: ['k.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1/dirx
    dirs: ['diry']
    files: ['z.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir1
    dirs: ['dir4', 'dirx']
    files: ['e.py', 'f.py', 'g.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb/dirc
    dirs: []
    files: ['aha.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira/dirb
    dirs: ['dirc']
    files: []
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2/dira
    dirs: ['dirb']
    files: []
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir2
    dirs: ['dira']
    files: ['k.py', 'l.py', 'm.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3/dir5
    dirs: []
    files: ['z.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk/dir3
    dirs: ['dir5']
    files: ['x.py', 'y.py']
    
    root: /Users/nisen/Projects/python_advanced_class/test/test_os_walk
    dirs: ['dir1', 'dir2', 'dir3']
    files: ['a.py', 'b.py', 'c.py']
    
    

    四. 运行时修改遍历目录

    当topdown设置为True时,可以在处理时修改返回的 dirs 列表,这样可以遍历下面的目录时会根据修改后的 dirs 来遍历。比如下面的例子,在遍历的时候不把”CSV”目录包括在内:

    import os
    from os.path import join, getsize
    for root, dirs, files in os.walk('python/Lib/email'):
        print root, "consumes",
        print sum(getsize(join(root, name)) for name in files),
        print "bytes in", len(files), "non-directory files"
        if 'CVS' in dirs:
            dirs.remove('CVS')  # don't visit CVS directories
    

    文章引自:https://blog.csdn.net/imnisen1992/article/details/53359180

    相关文章

      网友评论

          本文标题:Python目录遍历 os.walk

          本文链接:https://www.haomeiwen.com/subject/aqnglftx.html