os.walk目录遍历

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

os.walk

os.walk的参数如下:

os.walk(top, topdown=True, οnerrοr=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

参考资料

python os.walk_Python os.walk() 简介相关推荐

  1. 【Python 标准库学习】多种操作系统接口和常用路径操作库 — os 与 os.path

    欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/ os 模块简介:主流操作系统有 Windows.UNIX.Mac OS 等,os ...

  2. python 畅玩os模块 顺便批量修改个图片尺寸

    目录 吐槽 文章介绍 OS模块 简介 常用功能 ▲(附)os.path 创建/删除 目录/文件 更改 目录/文件 名/位置 ▲获取 路径/目录/文件 名 批量处理图片尺寸 实现思路 详细步骤 安装PI ...

  3. 进阶第四课 Python模块之os

    os模块,一起来看下都有哪些常用的方法,也就是有哪些函数或者功能. 首先了解一下os的组成 >>> import os >>> dir(os) ['DirEntry ...

  4. python os模块安装_二十七、深入浅出Python中的 os模块

    「@Author: Runsen」 当初学Python的时候,把一些标准库和第三方开源库学的七零八落,不成系统,正好趁这个机会来系统的整理一下,先从Python常用的标准库os开始吧. os OS模块 ...

  5. python根须系统斜杠_深入浅出Python中的os模块

    「@Author:Runsen」 当初学Python的时候,把一些标准库和第三方开源库学的七零八落,不成系统,正好趁这个机会来系统的整理一下,先从Python常用的标准库os开始吧. os OS模块简 ...

  6. Python 内置模块之 os

    os.walk os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情.简单来说,就是挨个遍历指定路径下的目录(文件夹)和文件.用于通过在目录树中游走输出 ...

  7. python知识总结os**

    1.os.walk的用法 os.walk的函数声明为: walk(top, topdown=True, οnerrοr=None, followlinks=False) 参数 top 是你所要便利的目 ...

  8. Python 标准库 —— os 路径(os.path)

    <a href="http://blog.csdn.net/lanchunhui/article/details/50193327", target="_blank ...

  9. Python常用模块os——与操作系统交互

    os.getcwd() 返回当前工作目录绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit ...

最新文章

  1. Push Notifications
  2. AutoCAD如何输入文字
  3. 【MFC】根据菜单创建工具栏
  4. 账户配置 三: Gmail
  5. Oracle命令--如何查看oracle中创建的所有目录
  6. 马斯克谈买比特币:当法币实际利率为负时 只有“傻子”才不放眼他处
  7. 串的复制——串传送指令MOVSB和方向标志位DF和CLD和REP
  8. PHP:车牌照合法性
  9. fei 正则表达式_正则表达式 匹配 中文/日文/韩文
  10. AVS2音视频编码标准
  11. word中公式编辑完后光标靠下解决办法
  12. D3D11 加载静态3D模型(.obj格式)
  13. 高德离线地图vue-amap的api文档(1):创建地图,撒点等等
  14. 在线点餐APP开发前景如何?
  15. Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx
  16. c语言中对float保留固定3位,float保留三位小数 float,double 除法 保留 指定位
  17. threejsV0.143.0版本如何设置uv坐标贴图
  18. canvas效果案例:安卓机器人
  19. uniapp使用Vant ui
  20. 示波器常用的13个概念

热门文章

  1. Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能
  2. http协议知识msdn
  3. 插入数据的时候出现错误:Error during job, obtaining debugging information…
  4. run as date怎么用_熟词僻义 | date是一种什么水果?
  5. 日志文件和mysql同步到kafka_logstash_output_kafka:Mysql 同步 Kafka 深入详解
  6. 安装linux必不可少的一个分区,安装linux系统对硬盘分区时,必须有的两种分区类型是什么?...
  7. java接口如何接受语音参数_Java 是如何优雅地实现接口数据校验的?
  8. Win7系统更换软件图标的详细方法
  9. 预处理prepareStatement是怎么防止sql注入漏洞的?
  10. @Autowired注入为null的几种情况