python中如何遍历文件夹及其子文件夹中的所有文件(附实现代码)

本文介绍两种在Python中遍历文件夹及其子文件夹中所有文件的方法。一是使用os.listdir()+递归,二是利用os.walk()函数,后者更为简便。os.walk()返回一个生成器,提供目录树中文件名的树形结构。
部署运行你感兴趣的模型镜像

【时间】2018.10.27

【题目】python中如何遍历文件夹及其子文件夹中的所有文件

目录

概述

一、使用os.listdir()函数+递归的方式实现

二、使用os.walk()函数实现


概述

      本文提供了python中如何遍历文件夹及其子文件夹中的所有文件的两种方法。两者均返回文件名列表(可以选择文件名列表或者是包含完整路径的文件名列表)。一种是使用os.listdir()函数+递归的方式,另一种用到了os.walk()函数,第二种方法比较简便。

 

一、使用os.listdir()函数+递归的方式实现

【实现代码】:

import os


image_path = 'F:\\test\\frames'


# 遍历文件夹及其子文件夹中的文件,并存储在一个列表中

# 输入文件夹路径、空文件列表[]

# 返回 文件列表Filelist,包含文件名(完整路径)

def get_filelist(dir, Filelist):

    newDir = dir

    if os.path.isfile(dir):

        Filelist.append(dir)

        # # 若只是要返回文件文,使用这个

        # Filelist.append(os.path.basename(dir))

    elif os.path.isdir(dir):

        for s in os.listdir(dir):

            # 如果需要忽略某些文件夹,使用以下代码

            #if s == "xxx":

                #continue

            newDir=os.path.join(dir,s)

            get_filelist(newDir, Filelist)

    return Filelist



if __name__ =='__main__' :

    list = get_filelist('F:\\test\\frames', [])

    print(len(list))

    for e in list:

        print(e)

【补充说明】:

1、os.path.basename()函数用于返回路径path最后的文件名。若path以/或\结尾,那么就会返回空值。例如:

二、使用os.walk()函数实现

 

【实现代码】

import os

path ='F:\\test\\frames'

def get_filelist(dir):

    Filelist = []

    for home, dirs, files in os.walk(path):

        for filename in files:

            # 文件名列表,包含完整路径

            Filelist.append(os.path.join(home, filename))

            # # 文件名列表,只包含文件名

            # Filelist.append( filename)

    return Filelist

if __name__ =="__main__":

    Filelist = get_filelist(dir)

    print(len( Filelist))

    for file in  Filelist :

        print(file)

 

 

【补充说明】:

1、os.walk的函数声明为:

walk(top, topdown=True, οnerrοr=None, followlinks=False)

参数

  • top 是你所要便利的目录的地址

  • topdown 为真,则优先遍历top目录,否则优先遍历top的子目录(默认为开启)

  • onerror 需要一个 callable 对象,当walk需要异常时,会调用

  • followlinks 如果为真,则会遍历目录下的快捷方式(linux 下是 symbolic link)实际所指的目录(默认关闭)

os.walk 的返回值是一个生成器(generator),也就是说我们需要不断的遍历它,来获得所有的内容。

每次遍历的对象都是返回的是一个三元组(root,dirs,files)

  • root 所指的是当前正在遍历的这个文件夹的本身的地址

  • dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)

  • files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

 

 

 

 

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮用户解决如何使用Pythonos.walk遍历文件夹及其文件夹来查找特定文件的问题。首先,我得回忆一下用户之前的对话历史,确保回答符合他们的需求。 用户之前的问题是关于使用OpenCV将图片合成视频,现在转向文件遍历,可能是在处理图像文件时需要批量处理。用户提到参考了站内的引用[1][2],其中提到了os.walkos.path.walk的使用。不过注意到os.path.walkPython 3已经被弃用,用户应该使用os.walk,这点需要明确指出,避免混淆。 接下来,用户需要的是一个具体的示例,演示如何用os.walk查找特定文件。首先,我应该给出一个基本的示例,展示如何遍历目录并收集符合条件的文件。比如,查找所有的.txt文件,或者图片文件.jpg、.png等。需要强调文件扩展名的处理,可能用户需要不区分大小写,所以用lower()方法处理文件名会更好。 然后,用户可能需要更高级的功能,比如根据文件名模式(通配符或正则表达式)搜索,或者排除某些目录。这时候可以扩展示例,加入正则表达式匹配过滤目录的功能。比如使用re模块来匹配文件名模式,或者在遍历过程中跳过某些文件夹,如.git或__pycache__,这样可以提高效率。 另外,用户可能对性能优化有需求,特别是当处理大量文件时。可以提到使用生成器表达式或列表推导式来提高效率,或者使用多线程/多进程来处理,但这可能比较复杂,根据用户的需求层次决定是否深入。 还要考虑错误处理,比如目录不存在或者权限问题,这时候在代码中加入try-except块是有必要的,但用户示例中可能不需要太复杂,可以作为一个提示提到。 最后,确保回答结构清晰,分步骤说明,并提供完整代码示例。用户可能需要直接复制代码使用,所以代码的准确性可运行性很重要。同时,相关问题部分可以引导用户了解更深入的应用,如异步遍历文件内容搜索等,帮助他们扩展应用场景。 总结一下,回答需要包括: 1. 基本使用方法,强调os.walk的三元组结构。 2. 查找特定扩展名文件的示例代码。 3. 高级功能,如正则匹配目录过滤。 4. 性能优化提示常见问题解决方案。 5. 相关问题引导进一步学习。 确保语言简洁,示例代码正确,并参考用户之前的OpenCV代码风格,保持一致性。</think>#### Python遍历文件夹查找文件的完整指南 通过$os.walk()$实现多级目录遍历,可以快速定位目标文件。以下是具体实现方法扩展技巧: --- ### 一、基础遍历方法 #### 1. 核心代码结构 ```python import os def find_files(root_dir, target_ext): found_files = [] for root, dirs, files in os.walk(root_dir): # 遍历目录树 for file in files: if file.endswith(target_ext): # 判断扩展名 found_files.append(os.path.join(root, file)) return found_files # 示例:查找所有PDF文件 pdf_files = find_files("/documents", ".pdf") print(f"找到 {len(pdf_files)} 个PDF文件") ``` #### 2. 参数说明 - `root_dir`: 起始搜索路径(支持绝对/相对路径) - `target_ext`: 目标文件扩展名(需带点号,如`.jpg`) - 返回结果包含完整路径(如`C:\docs\file1.pdf`) --- ### 二、高级搜索模式 #### 1. 多扩展名支持 ```python def find_multiple_ext(root_dir, extensions): ext_set = {ext.lower() for ext in extensions} # 转为小写集合 matches = [] for root, _, files in os.walk(root_dir): for file in files: if os.path.splitext(file)[1].lower() in ext_set: # 分割扩展名 matches.append(os.path.join(root, file)) return matches # 示例:查找图片文件 image_files = find_multiple_ext("/photos", ['.jpg', '.png', '.webp']) ``` #### 2. 正则表达式匹配 ```python import re def regex_search(root_dir, pattern): regex = re.compile(pattern) results = [] for root, _, files in os.walk(root_dir): for file in files: if regex.search(file): # 匹配文件名 results.append(os.path.join(root, file)) return results # 示例:查找2023年的日志文件 log_files = regex_search("/logs", r'^applog_2023\d{4}\.log$') ``` --- ### 三、性能优化技巧 1. **目录过滤** 在遍历时动态排除不需要的目录: ```python for root, dirs, files in os.walk(start_dir): dirs[:] = [d for d in dirs if d not in {'node_modules', '__pycache__'}] # 修改dirs列表实现过滤 ``` 2. **并行处理** 使用多线程加速大规模搜索: ```python from concurrent.futures import ThreadPoolExecutor def fast_search(root_dir): with ThreadPoolExecutor() as executor: futures = [] for root, _, files in os.walk(root_dir): futures.append(executor.submit(process_files, files)) # 处理异步结果... ``` --- ### 四、常见问题解决方案 1. **中文路径报错** 添加路径编码声明: ```python import sys sys.stdout.reconfigure(encoding='utf-8') # Python 3.7+ required ``` 2. **隐藏文件处理** 显示系统隐藏文件: ```python os.walk() # 默认包含隐藏文件,如需过滤: files = [f for f in files if not f.startswith('.')] # Unix系统隐藏文件 ``` 3. **路径标准化** 统一路径格式: ```python from pathlib import Path Path(file_path).as_posix() # 将Windows路径转为斜杠格式 ``` --- ### 完整代码示例 ```python import os import re from typing import List def advanced_file_search( root_dir: str, extensions: List[str] = None, name_pattern: str = None ) -> List[str]: """ 高级文件搜索工具 参数: root_dir -- 搜索根目录 extensions -- 允许的文件扩展名列表(如 ['.txt', '.csv']) name_pattern -- 文件名正则表达式(如 r'^report_.*\.xlsx$') 返回: 匹配文件的完整路径列表 """ matches = [] ext_check = bool(extensions) pattern_check = bool(name_pattern) # 预处理匹配条件 ext_set = {e.lower() for e in extensions} if extensions else None regex = re.compile(name_pattern) if name_pattern else None for root, dirs, files in os.walk(root_dir): # 过滤不需要遍历目录 dirs[:] = [d for d in dirs if d not in {'temp', 'backup'}] for file in files: file_path = os.path.join(root, file) # 扩展名检查 if ext_check: file_ext = os.path.splitext(file)[1].lower() if file_ext not in ext_set: continue # 正则匹配检查 if pattern_check and not regex.search(file): continue matches.append(file_path) return matches ``` --- ### 五、扩展应用场景 1. **文件内容搜索** 结合文件内容过滤: ```python def search_in_files(root_dir, keyword): results = [] for root, _, files in os.walk(root_dir): for file in files: if file.endswith('.txt'): path = os.path.join(root, file) with open(path, 'r', encoding='utf-8') as f: if keyword in f.read(): results.append(path) return results ``` 2. **自动分类系统** 根据扩展名自动整理文件: ```python from shutil import copy2 def auto_organize(src_dir, dest_dir): ext_map = { '.jpg': 'Images', '.png': 'Images', '.pdf': 'Documents', '.docx': 'Documents' } for file in advanced_file_search(src_dir, ext_map.keys()): ext = os.path.splitext(file)[1] target_dir = os.path.join(dest_dir, ext_map[ext]) os.makedirs(target_dir, exist_ok=True) copy2(file, target_dir) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值