python 递归遍历修改文件名

本文介绍如何在Windows环境下利用Python编程实现文件夹的递归遍历,并在此过程中修改文件的名称。通过这个教程,读者将学习到Python处理文件系统的相关技巧。

前言 

环境为windows

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys, string, os  

path="E:\XXX\XXX" #路径
prefix = "ZX-" #前缀

dirname = ""
index = 1	
def RenameFiles(path,prefix):
	global index 
	global dirname
	#获取目录下所有文件,包括文件夹
	parents = os.listdir(path)
	for parent in parents:
		#拼接一个当前文件的路径
		child = os.path.join(path,parent)
		#print(child)
		if os.path.isdir(child):#判断是否为文件夹 是文件夹 递归调用函数
			dirname = parent
			RenameFiles(child,prefix)
			#print(child)
		else:#不是文件夹 递归调用函数
			#获取文件名称 例 "aaa.png"  filename = aaa
			filename = os.path.splitext(parent)[0]#parent.split('.')[0][-1]
			#获取文件后缀名 例 "aaa.png"  sufix =.png
			sufix = os.path.splitext(child)[1]
			#判断后缀名
			if (sufix == ".png" or sufix == ".PNG" or sufix == ".jpg"):
				#print(sufix)			
				#拼接一个新的文件路径
				newfile = path + "\\" + prefix + dirname +"-%04d"%(index) + sufix
				print(newfile)
				os.rename(child, newfile)#替换
				#meta文件也要改名
				oldfile_meta = c
<think>好的,我现在需要解决用户的问题,即如何使用Python递归遍历目录来查找指定类型的文件。用户希望得到示例代码。首先,我得回忆一下Python中处理文件系统的方法,尤其是递归遍历目录的部分。用户提到了递归遍历,所以首先想到的是os模块中的方法,比如os.listdir()和os.path的join、isdir、isfile等函数。根据引用中的内容,用户提供的示例代码里有用到递归函数来遍历子目录,例如引用2中的search_files函数,它通过检查每个条目是文件还是目录,如果是目录就递归调用自身。这应该是一个可行的方法。另外,引用4提到os.walk方法,可以更方便地遍历目录,无需手动递归,因为它会自动处理子目录。这可能是一个更简洁的解决方案。用户可能需要比较这两种方法的优缺点,选择适合自己需求的。接下来,用户需要查找指定类型的文件,比如扩展名为.txt、.jpg等。这需要在遍历过程中检查文件名的后缀。可以通过os.path.splitext()来获取文件扩展名,或者使用字符串的endswith()方法。现在需要将这些部分整合起来。首先,使用递归函数或os.walk来遍历所有目录和文件,然后过滤出符合扩展名的文件。例如,在引用2的代码中,当找到一个文件时,可以检查其扩展名是否符合要求,如果是则添加到结果列表。对于代码示例,可能需要两个版本:一个是手动递归的方法,另一个是使用os.walk的更简洁方法。用户可能希望看到这两种实现,以便选择更适合的。另外,需要注意路径的处理,比如使用os.path.join来确保路径的正确性,避免因为操作系统不同导致的路径问题。最后,需要验证代码的正确性,比如测试是否能够正确递归子目录,是否正确过滤文件类型,是否处理了异常情况(如权限问题等)。不过用户可能暂时不需要异常处理,但可以提及这一点作为优化方向。总结下来,步骤应该是:1.导入os模块。2.定义递归函数或使用os.walk。3.遍历每个条目,判断是目录还是文件。4.如果是目录,递归处理;如果是文件,检查扩展名。5.收集符合条件的文件路径。6.返回或输出结果。现在需要将这些步骤转化为具体的代码,并给出示例,比如查找所有.jpg文件。同时,可能需要解释代码的关键部分,帮助用户理解。</think>### Python递归遍历目录查找指定类型文件的方法 根据您的需求,我将介绍两种常用方法实现递归遍历目录查找特定类型文件(如.jpg、.txt等),并提供完整示例代码。 --- ### 方法一:手动递归遍历(基于os模块) ```python import os def find_files_by_ext(root_dir, target_ext): """ 递归查找指定扩展名的文件 :param root_dir: 起始目录 :param target_ext: 目标扩展名(如'.jpg') :return: 匹配文件的绝对路径列表 """ result = [] for entry in os.listdir(root_dir): full_path = os.path.join(root_dir, entry) if os.path.isdir(full_path): # 递归处理子目录 result.extend(find_files_by_ext(full_path, target_ext)) elif os.path.isfile(full_path): # 检查文件扩展名 if full_path.lower().endswith(target_ext.lower()): result.append(full_path) return result # 使用示例 found_files = find_files_by_ext('/path/to/start_dir', '.jpg') print(f"找到 {len(found_files)} 个文件:") for f in found_files: print(f) ``` **关键点说明:** 1. 使用`os.listdir()`遍历当前目录 2. `os.path.join()`处理路径拼接 3. 递归调用处理子目录 4. 通过`.endswith()`判断扩展名 5. 不区分大小写匹配扩展名 --- ### 方法二:使用os.walk自动递归(推荐) ```python import os def find_files_by_ext_v2(root_dir, target_ext): """ 使用os.walk实现更高效的遍历 """ matches = [] for root, dirs, files in os.walk(root_dir): for filename in files: if filename.lower().endswith(target_ext.lower()): matches.append(os.path.join(root, filename)) return matches # 使用示例(查找所有PDF文件) pdf_files = find_files_by_ext_v2('/documents', '.pdf') ``` **优势对比:** 1. 代码更简洁(自动处理递归) 2. 性能更优(减少系统调用次数) 3. 内存效率更高(分批处理目录) --- ### 扩展功能实现 若需要同时查找多个扩展名,可以修改判断条件: ```python target_exts = ['.jpg', '.jpeg', '.png'] if any(filename.lower().endswith(ext) for ext in target_exts): ``` --- ### 性能优化建议 1. **过滤隐藏文件**:添加`if not filename.startswith('.')`条件(Linux/Mac) 2. **并行处理**:使用`concurrent.futures`实现多线程遍历[^4] 3. **缓存机制**:对重复查询任务保存结果到临时文件 4. **异常处理**:添加try-except块处理权限错误 --- ### 典型应用场景 1. 批量图片处理(如压缩、格式转换) 2. 日志文件分析(查找特定格式日志) 3. 文档管理系统(分类存储不同格式文件) 4. 自动化测试(定位测试用例文件) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值