仿照 os.walk 寫了一個 generator lwalk, 他的行為如同 os.walk 但是多了一個 max_level 可以控制最大的遍歷深度, 為了與 os.walk 盡量吻合, 我也實作了 topdown 和 followlinks 這兩個 arguments, 但為了不使 code 太過複雜, 我省略了 onerror 參數的實作以及若干 error handling。

代碼如下:

import os

def lwalk(top, topdown=True, followlinks=False, max_level=None):

if max_level is None:

new_max_level = None

else:

if max_level==0:

return

else:

new_max_level = max_level-1

top = os.fspath(top)

dirs, nondirs, walk_dirs = [], [], []

with os.scandir(top) as it:

for entry in it:

if entry.is_dir():

dirs.append(entry.name)

else:

nondirs.append(entry.name)

if not topdown and entry.is_dir():

if followlinks or not entry.is_symlink():

walk_dirs.append(entry.path)

if topdown:

yield top, dirs, nondirs

for dirname in dirs:

new_path = os.path.join(top, dirname)

if followlinks or not os.path.islink(new_path):

yield from lwalk(new_path, topdown, followlinks, new_max_level)

else:

for new_path in walk_dirs:

yield from lwalk(new_path, topdown, followlinks, new_max_level)

yield top, dirs, nondirs

簡單的範例如下:

for root, dirs, files in lwalk('YOUR_TOP_PATH', max_level=4):

print(root, dirs, files)

一些說明:

核心在於使用 os.scandir 來保證系統遍歷的效率

使用 max_level 來控制最大遍歷深度, 在 recursively 進入下一層的時候, 將最大深度減 1

要實作 buttom up, 則需先 recursively 進入下一層再 yield 目錄與文件

這邊有一個省略掉 topdown, followlink 和若干處理的簡單版本, 可以幫助你觀察一下核心的實作手段:

import os

def lwalk(top, max_level=10000):

if max_level==0:

return

dirs, nondirs = [], []

with os.scandir(top) as it:

for entry in it:

if entry.is_dir():

dirs.append(entry.name)

else:

nondirs.append(entry.name)

yield top, dirs, nondirs

for dirname in dirs:

new_path = os.path.join(top, dirname)

yield from lwalk(new_path, max_level-1)

for root, dirs, files in lwalk('a', max_level=4):

print(root, dirs, files)

python os.walk 指定遍历深度_os.walk 如何设置遍历层级?相关推荐

  1. python os.walk 指定遍历深度_python遍历文件夹,指定遍历深度与忽略目录的方法

    背景 需要在文件夹中搜索某一文件,找到后返回此文件所在目录.用最常规的os.listdir()方式实现了一版,但执行时报错:递归超过最大深度.于是自己添加了点功能,之所有写此函数是为了让它适应不同的项 ...

  2. python os.walk遍历目录_python中os.walk()遍历目录中所有文件

    之前一直用判断目录和文件的递归方法来获取一个目录下的所有文件,后来发现python里面已经写好了这个函数,不需要自己递归获取了,记录下os.walk()函数的用法 目的:获取path下所有文件,返回由 ...

  3. Python os.walk() 方法遍历文件目录

    概述 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 在Un ...

  4. python os.walk_Python os.walk() 简介

    os.walk目录遍历 每个月都有那么几天想划水,又到划水的日子了,今天分享的是刚在处理遍历目录相关用到的相关方法. os.walk os.walk的参数如下: os.walk(top, topdow ...

  5. Python os.walk() 方法--输出在目录中的文件名

    概述 os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. 语法 ...

  6. python os.walk()

    os.walk(),在目录树中游走,输出目录中的文件名 os.walk(top,topdown,onerror,followlinks) top--需要遍历的目录地址,返回的是一个三元组(root,d ...

  7. python: os.walk() 相关操作

    os.walk(): 通过在目录树中游走输出在目录中的文件名,向上或者向下 ## 语法格式 os.walk(top[, topdown=True[, onerror=None[, followlink ...

  8. Python os.chdir() 方法用于改变当前工作目录到指定的路径。

    Python os.chdir() 方法 正在上传-重新上传取消​ Python OS 文件/目录方法 概述 os.chdir() 方法用于改变当前工作目录到指定的路径. 语法 chdir()方法语法 ...

  9. python来进行图的深度遍历和广度遍历

    python来进行图的深度遍历和广度遍历 # -*- coding: utf-8 -*- """ Created on Sat Sep 14 18:01:27 2019@ ...

最新文章

  1. java中ArrayList
  2. android 登录组件开发,Android组件化开发路由的设计
  3. ubuntu 10.10 安装 oracle 11G
  4. python获取ftp所有文件名_在Python中获取最新的FTP文件夹名称
  5. linux qemu 报错 Unable to reserve 0xfffff000 bytes of virtual address space at 0x1000 解决方法
  6. 学习Python语言 基础语法:变量的基本使用
  7. Linux--DHCP
  8. 2021-03-01 Matlab 多项式的根求解
  9. 鼠标控制视角wasd移动_无线款,轻量级,稳控制:雷蛇(Razer) 毒蝰终极版鼠标的快速体验...
  10. IPv4 和 IPv6 有什么区别
  11. 新生代的他们,正在续写“黑客”传奇
  12. Linux下rpm安装软件
  13. GB35114-SIP部分技术预研
  14. 计算机常用计算单位换算关系,计算机单位换算
  15. Nexmo 短信平台接口 遇到的坑
  16. markdown编辑器——文字颜色、大小、字体、背景色、图片大小与居中对齐的设置方法
  17. 阐述免费增值游戏的设计特点及注意事项
  18. 计算机组成原理知识点2
  19. python编程超市购物系统_淘淘购物系统 (Python)
  20. 关于AQS中的enq方法的理解

热门文章

  1. 伤疤好了有黑印怎么办_伤疤好了有黑印怎么办 轻松拥有平滑肌
  2. 自动驾驶的大脑——芯片简介
  3. FRM计算器使用流程你知道吗?
  4. unity超级马里奥2d游戏开发-03瓦片地图场景搭建
  5. java使用POI操作excel
  6. 1990-2021年全国各省城市化水平数据
  7. HTML西安旅游网页设计作业成品 大学生旅游风景区网页设计作业模板下载 静态HTML旅游景点网页制作下载 DW网页设计代码
  8. c语言如果输出宽度大于,C语言格式输出
  9. 小红书发布2022年美妆用户洞察报告,近八成用户选它
  10. 一文详解双目立体视觉系统的精度提升方法!