用Python快速遍历指定路径下的某类文件

本文介绍两种使用Python编写的函数,一种用于检索指定目录下特定后缀的所有文件,另一种则递归地搜索目录及其子目录来查找指定后缀的文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
def getflist1(path,suffix): #获取每个路径下的suffix后缀的文件

   #用列表推导式实现,简洁,优雅。。。。。。
    res=[os.path.join(path,fname) for fname in os.listdir(path) if fname.endswith(suffix)]
    return res

path=r'E:\BigCSv等1个文件\BigCSv'
res=getflist1(path,'.py')

print(res)

#function getflist1 只遍历根目录

def getflist2(path,suffix):
    res=[]
    for root, dirs, files in os.walk(path):
        for f in files:
            if f.endswith(suffix):
                res.append(os.path.join(root, f))

    return res
path=r'E:\BigCSv等1个文件\BigCSv'
res=getflist2(path,'.py')
print(res)
#function getflist2 遍历根目录及子目录

<think>好的,用户的问题是关于如何用Python遍历文件名,需要示例代码,特别是使用os.walk和glob模块。我之前已经整理过相关的引用内容,现在需要根据这些引用和用户的问题来构建回答。 首先,用户明确提到了os.walk和glob,所以这两个模块应该是重点。根据引用[1],os.walk的使用方法已经有了示例代码,可以详细说明每一步的作用。同时,引用[2]和[3]提供了glob模块的示例,包括递归查找,这也是用户可能需要的。 然后,用户可能还需要其他方法,比如os.listdir结合os.path.join,或者os.scandir,这些在引用[1]中也有提到。需要检查这些方法是否适用,并给出对应的代码示例。 接下来,要确保回答结构清晰,分点说明每种方法,并比较它们的优缺点。比如,os.walk适合递归遍历,而glob.glob在简单情况下更简洁。还要注意提到不同Python版本的区别,比如os.scandir在3.5+中的使用,以及glob的递归匹配同样需要3.5+。 另外,用户可能需要知道路径处理的注意事项,比如不同操作系统的路径分隔符,这在引用[3]中有提到,应该包含在回答中,帮助用户避免常见错误。 最后,生成相关问题时要考虑用户可能的后续需求,比如性能优化、特定扩展名的文件处理,或者文件操作的其他方面。确保问题与遍历文件名相关,但又有一定的扩展性,帮助用户深入了解更多内容。</think>### 如何用Python遍历文件Python提供了多种遍历文件名的标准库方法,以下是常用的4种实现方式及对比: #### 1. **`os.walk` 递归遍历(推荐)** ```python import os def traverse_with_oswalk(folder): for root, dirs, files in os.walk(folder): for file in files: print(os.path.join(root, file)) # 输出完整路径 ``` - **特点**:递归遍历所有子目录,返回三元组(当前目录路径、子目录列表、文件列表) - **优势**:支持深度优先遍历,适合需要处理嵌套目录的场景[^1][^4] #### 2. **`glob` 模式匹配** ```python import glob # 匹配当前目录所有文件 print(glob.glob("/path/*")) # 递归匹配所有子目录的.jpg文件Python 3.5+) print(glob.glob("/path/**/*.jpg", recursive=True)) ``` - **特点**:支持通配符(`*`匹配任意字符,`?`匹配单个字符,`[]`匹配指定字符) - **优势**:语法简洁,支持递归模式匹配(需设置`recursive=True`)[^2][^3] #### 3. **`os.listdir` + `os.path` 基础遍历** ```python import os def traverse_with_listdir(folder): for entry in os.listdir(folder): full_path = os.path.join(folder, entry) if os.path.isfile(full_path): print(full_path) # 仅文件 ``` - **特点**:仅遍历当前目录,不包含子目录 - **优势**:内存占用低,适合简单场景 #### 4. **`os.scandir` 高效遍历Python 3.5+)** ```python with os.scandir("/path") as entries: for entry in entries: if entry.is_file(): print(entry.path) # 直接获取文件信息 ``` - **特点**:返回`DirEntry`对象,可快速获取文件属性 - **优势**:性能优于`os.listdir`,官方推荐方法[^1] --- ### **方法对比表** | 方法 | 递归能力 | 返回信息 | 性能 | 适用场景 | |--------------------|----------|---------------|------|-----------------------| | `os.walk` | ✔️ | 路径分离 | 中 | 深度目录遍历 | | `glob.glob` | ✔️(3.5+) | 完整路径列表 | 中 | 模式匹配文件 | | `os.listdir` | ✖️ | 条目名称 | 高 | 单层目录快速扫描 | | `os.scandir` | ✖️ | 文件对象 | 最高 | 需要文件元数据时 | --- ### **路径处理注意事项** - 使用`os.path.join()`自动处理路径分隔符(Windows用`\`,Linux/macOS用`/`) - 检查文件类型时优先用`entry.is_file()`(比`os.path.isfile()`更快) - 处理隐藏文件需注意:以`.`开头的文件在Unix系统中会被`glob.glob("*")`忽略[^3] --- ### **扩展应用示例** **统计某类文件数量(例如`.csv`):** ```python csv_count = sum(len(files) for _, _, files in os.walk("/data") if file.endswith(".csv")) ``` **按修改时间筛选文件:** ```python import time cutoff = time.time() - 7*24*3600 # 7天前 for entry in os.scandir("/logs"): if entry.is_file() and entry.stat().st_mtime < cutoff: print(f"过期文件: {entry.path}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值