资讯专栏INFORMATION COLUMN

Python os.walk() 简介

fanux / 2421人阅读

摘要:可以用来设置当便利出现错误的处理函数该函数接受一个的实例作为参数,设置为空则不作处理。返回的是一个个元素的元组,分别表示遍历的路径名,该路径下的目录列表和该路径下文件列表。

os.walk目录遍历

每个月都有那么几天想划水,又到划水的日子了,今天分享的是刚在处理遍历目录相关用到的相关方法。

os.walk

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,dir)os.path.join(root,dir)

例子

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

➜  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://docs.python.org/2/lib...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44309.html

相关文章

  • Python文件及目录操作

    摘要:报告这错误后,继续或者抛出终止。调用方式当前遍历的目录目录下的目录列表目录下的文件列表在进行文件内指针重置的时候,除了基础篇文件部分介绍的绝对定位外,通过模块还可以实现相对定位。 Python的目录操作主要依赖于os和 shutil 模块. Python目录操作 新建目录 os.mkdir(./test/) #在当前目录下新建名为test的目录,存在则报错 新建多级目录 os.make...

    dkzwm 评论0 收藏0
  • 这可能是最详细的Python文件操作

    摘要:删除删除只能删除文件,若为目录则报错若文件正在使用,下会直接报错,下会在目录表中删除记录,但文件还在与一样的作用删除目录,目录必须为空,否则报错递归删除空目录删除整个目录不管此目录下有多少目录和文件新建新建新建文件夹,若倒数第二层文件夹不存 删除 # ==================删除================== # 只能删除文件,若为目录则报错 # 若文件正在使用,Wi...

    阿罗 评论0 收藏0
  • 经验拾忆(纯手工)=> Python好用深度技能工具介绍

    摘要:单元素元祖这是整数这才是元祖也许这两行,你们当时疑惑过,并且现在也都知道了,当然重点并不在这里。。虽然我水平很垃圾,但是我知道匿名函数有一种执行方式叫做自执行。看吧,这就是版的匿名函数自执行方法。 单元素元祖: a = (1) # 这是整数1 a = (1,) # 这才是元祖 也许这两行,你们当时疑惑过,并且现在也都知道了,当然重点并不在这里。。 我无聊的时候想过,为什么单...

    UnixAgain 评论0 收藏0
  • Python os模块参考手册

    摘要:像但创建的所有文件夹需要包含子文件夹。如果子文件夹不能被成功删除,将抛出。是一个字符串的路径在中子文件夹的列表不包括。如果参数为或者指定一个的将比它的任何子文件夹的先产生自上而下。 Python的标准库中的os模块包含普遍的操作系统功能。这个模块的作用主要是提供与平台无关的功能。也就是说os模块能够处理平台间的差异问题,使得编写好的程序无需做任何改动就能在另外的平台上运行。当然,这个模...

    sherlock221 评论0 收藏0
  • Python之合并PDF文件

    摘要:在日常的学习生活工作中,我们有时会遇到需要合并文件的需求。模块的相关参考文档网址为本文将介绍如何利用来完成文件的合并。   在日常的学习生活工作中,我们有时会遇到需要合并PDF文件的需求。这时,我们可以利用相关的PDF软件(如Adobe Acrobat Reader DC)来完成这个任务,幸运的是,Python也为我们提供了这方面的处理模块PyPDF2, 借用它,我们可以利用Pytho...

    maxmin 评论0 收藏0

发表评论

0条评论

fanux

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<