Python--递归与非递归遍历文件夹的方法

递归概念

递归是一种编程技术,允许函数调用自身来解决问题。设计递归函数时,需要考虑基本情况和递归步骤。

递归函数设计

  • 基本情况:递归结束的条件。
  • 递归步骤:函数调用自身解决更小的子问题。

递归方法实现

import osdef get_files_recursion_from_dir(path):file_list = []if os.path.exists(path):for f in os.listdir(path):new_path = os.path.join(path, f)if os.path.isdir(new_path):file_list += get_files_recursion_from_dir(new_path)else:file_list.append(new_path)return file_list

非递归遍历方法

除了递归,以下是几种常用的遍历文件夹的方法:

1. 使用 os.walk()

os.walk() 是一个生成器函数,遍历指定目录及其子目录,生成三元组 (dirpath, dirnames, filenames)

import osdef get_files_walk(path):file_list = []for dirpath, dirnames, filenames in os.walk(path):for filename in filenames:file_list.append(os.path.join(dirpath, filename))return file_list
2. 使用 glob.glob()glob.iglob()

glob 模块提供通配符搜索文件路径的功能。

import globdef get_files_glob(path):file_list = []for filename in glob.iglob(path + "/**/*", recursive=True):file_list.append(filename)return file_list
3. 使用 pathlib.Path

pathlib 提供面向对象的文件系统路径操作。

from pathlib import Pathdef get_files_pathlib(path):file_list = [str(file) for file in Path(path).rglob('*')]return file_list
4. 使用 scandir()scandir_iter()

scandir() 是一个迭代器,可以遍历目录中的文件和目录。

import osdef get_files_scandir(path):file_list = []for entry in os.scandir(path):if entry.is_file():file_list.append(entry.path)elif entry.is_dir():file_list.extend(get_files_scandir(entry.path))return file_list
5. 使用 subprocess

通过调用系统命令,可以使用 subprocess 模块获取文件列表。

import subprocessdef get_files_subprocess(path):result = subprocess.run(['find', path, '-type', 'f'], stdout=subprocess.PIPE)file_list = result.stdout.decode().split('\n')return [file for file in file_list if file]

注意事项

  • 递归函数需要有明确的退出条件,避免栈溢出错误。
  • 递归深度可能受到限制,对于极深的文件夹结构,递归可能不是最佳选择。
  • os.walk() 在遍历过程中遇到权限错误会抛出 OSError
  • 遍历过程中,如果目录结构发生变化,os.walk() 的行为是未定义的。

使用 os.access() 检查文件或目录的权限

os.access() 函数用于检查当前进程是否有权限访问指定的文件或目录。它接受以下模式作为访问权限的检查:

  • os.F_OK:检查文件或目录是否存在。
  • os.R_OK:检查文件是否可读。
  • os.W_OK:检查文件是否可写。
  • os.X_OK:检查文件是否可执行(在UNIX系统上有效)。

使用 os.access() 检查文件或目录的权限:

  1. 检查文件或目录是否存在
import ospath = '/path/to/file/or/directory'
if os.access(path, os.F_OK):print(f"{path} 存在。")
else:print(f"{path} 不存在。")
  1. 检查文件是否可读
if os.access(path, os.R_OK):print(f"{path} 是可读的。")
else:print(f"{path} 不可读。")
  1. 检查文件是否可写
if os.access(path, os.W_OK):print(f"{path} 是可写的。")
else:print(f"{path} 不可写。")
  1. 检查文件是否可执行(仅UNIX系统):
if os.access(path, os.X_OK):print(f"{path} 是可执行的。")
else:print(f"{path} 不可执行。")
  1. 组合检查
if os.access(path, os.R_OK | os.W_OK):print(f"{path} 是可读写的。")

避免 os.walk() 遍历时的权限错误

在使用 os.walk() 遍历文件夹时,可能会遇到权限错误。以下是一些避免或处理权限错误的策略:

  1. 检查权限:在尝试访问目录之前,使用 os.access() 函数检查当前用户是否有权限读取该目录。

  2. 捕获异常:在遍历过程中,使用 try-except 块来捕获可能发生的 OSErrorPermissionError 异常,并决定如何处理这些异常(例如,跳过该目录或记录错误信息)。

  3. 使用更宽松的权限:如果程序运行在具有较少权限的用户下,考虑以更高权限运行程序,例如使用 sudo(在Linux系统中)。

  4. 修改文件夹权限:在某些情况下,可能需要修改文件夹的权限,以便用户可以访问。这可以通过 os.chmod() 函数实现,但需要谨慎使用,以避免安全风险。

  5. 记录错误:在无法访问的目录上记录错误信息,可能对调试或了解程序运行情况有帮助。

  6. 用户反馈:如果程序是交互式的,可以向用户报告权限错误,并提示他们采取适当的行动。

  7. 使用日志:记录权限错误的详细信息到日志文件中,有助于事后分析。

  8. 递归检查:在递归调用 os.walk() 之前,先检查子目录的权限,如果无权限则不进行递归。

  9. 使用 pathlib:虽然 pathlibPath.rglob() 方法在遇到权限错误时也会抛出异常,但它提供了更现代的面向对象的API,可以与异常处理结合使用。

选择哪种方法取决于具体需求和个人偏好。递归是一种强大的技术,但需要谨慎使用。非递归方法如 os.walk()pathlib.Path.rglob() 提供了易于理解和使用的替代方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络初识和网络编程(Java版)

前言 网络已经成为我们日常生活中不可分割的一部分,我们每天都会从网络上得到各种各样的信息,我们也会在网络上传播各种各样的信息,可以说我们使用的软件都是依赖于网络的。作为一个程序猿,在我们未来部署的软件中,客…

【存储学习笔记】1:机械硬盘(Hard Drive Disk)结构和寻址方式

目录 HDD的结构HDD的寻址方式CHS寻址(不适用于等密度结构磁盘)LBA寻址(目前普遍使用的线性寻址方式) HDD的寻址速度 HDD的结构 盘面(Platter):单面或者双面覆盖着用于记录数据的磁性物质&#x…

《昇思25天学习打卡营第25天|第23天》

今天是打卡的第二十三天,今天学习的是应用实践篇中的计算机视觉中FCN图像语义分割。 首先,是对全卷积网络(FCN)的简介,语义分割的简介,模型简介(1、卷积化,2、上采样,3、…

OpenStack中nova的架构

1.1 nova-api 负责接收和相应客户的API调用。 1.2 compute core nova-schedule 负责决定在哪个计算节点运行虚拟机。 nova-compute 通过调用Hypervisor实现虚拟机生命周期的管理。一般运行在计算节点。 hypervisor 对虚拟机进行硬件虚拟化的管理软件&#xff…

初级java每日一道面试题-2024年7月21日-Collection和Collections的区别

面试官: Collection和Collections的区别? 我回答: 一、定义与功能 Collection 定义:Collection是Java集合框架中的一个基本接口,它代表了一组对象(也称为元素)的集合。它是List、Set等集合的父接口,定义了集合操作的…

Kali Linux APT 设置指南:如何控制软件包更新行为

在我浏览 CSDN 的问答社区时,我发现一篇求助内容是一位用户对于如何在使用 APT 更新时避免更新 Arduino 这个问题感到困惑。这激发了我写这篇博客的灵感。我希望通过这篇文章,帮助那些在 Kali Linux 上使用 APT 管理软件包更新的朋友们,特别是…

removeIf 方法设计理念及泛型界限限定

ArrayList 中的 removeIf 方法是 Java 8 中引入的集合操作方法之一。它使用了 Predicate 接口作为参数,以便根据指定的条件移除集合中的元素。以下是对 removeIf 方法入参设计的详细解释: Predicate 接口 Predicate 是一个函数式接口,定义了…

一线大厂java面试题

String 为什么要设计成不可变的 String被设计成不可变的有以下几个原因: 线程安全:由于String是不可变的,多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全1. 的。 2.缓存Hash值:由于String是不可变的&#xf…

接口性能优化思路

前言 日常开发中设计接口,响应时间是衡量一个接口质量的重要指标。 接口响应时间这里粗糙地分为三种: 即时响应:毫秒级,小于500毫秒快速响应:秒级,大于500毫秒且小于2秒长时间操作:大于2秒&a…

【Python其他检查字符串占字节数的方法】

在Python中,检查字符串在特定编码下占用的字节数,最标准且常用的方法是通过字符串的.encode()方法将字符串转换为字节串,然后使用len()函数来获取这个字节串的长度。这是因为字符串(在Python 3中)是以Unicode形式存储的…

力扣题解(一和零)

474. 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 思路: 本题可以看成有两个限…

51单片机嵌入式开发:15、STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒

STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒 1 概述2 蜂鸣器操作方法3 蜂鸣器发出音声4 硬件电路5 软件实现6 整体工程:7 总结 1 概述 要实现一个基于STC89C52RC单片机的音乐盒,可以按照以下步骤进行: (1)硬…

STM32项目分享:智能宠物喂食系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.com/video/BV1zy411z7…

关于对CSDN的谴责

关于对CSDN的谴责 如果不是心血来潮登了一次旧帐号我是万万不会想到,所有的文章都被设置成了仅VIP可见。 CSDN你的VIP有多不受人待见您不知道吗?为什么要把我用于你开通VIP刷绩效的工具? 这种东西不应该首先经过同意再开启吗?默认…

JavaWeb day01-HTML入门

Web前端 课程安排 HTML、CSS简介 HTML快速入门 实现标题排版 新闻标题样式

深度学习程序环境配置

深度学习环境配置 因为之前轻薄本没有显卡跑不起来,所以换了台电脑重新跑程序,故记录一下配置环境的步骤及常见错误 本人数学系,计算机部分知识比较匮乏,计算机专业同学可以略过部分内容 深度学习环境配置 深度学习环境配置 CUD…

MATLAB算法实战应用案例精讲-【数模应用】多元方差分析MANOVA(附MATLAB、python和R语言代码实现)

目录 知识储备 方差分析 一、单因素方差分析 二、双因素方差分析 三、多因素方差分析 四、事后多重比较 五、重复测量方差 六、协方差分析 七、多元方差分析 算法原理 多元方差分析的特点 多元方差分析的使用条件 应用案例 代码实现 MATLAB python R语言 知…

StringBuilder, Stringbuffer,StringJoiner

StringBuilder StringBuilder 代表可变字符串对象,相当于是一个容器,里面装的字符串是可以改变的,就是用来操作字符串的。 StringBuilder 比String更适合做字符串的修改操作,效率更高,代码更加的简洁。 public clas…

在结束的地方重新开始:十指之梢与新的轮回

一、前述 如果你想感受人潮汹涌,那么就请到大城市繁华街区的十字路口去看一看,尤其是节假日。 所以,交警对于城市交通的通畅,人们出行顺利的保障,是异常重要的。 交警,指挥交通有很多工具和方法&#xff0…

vscode 文件颜色变绿色

解决:关闭git功能 在设置中搜索Git:Enabled,取消Decorations: Enabled的勾选