Python遍历子目录修改文件及扩展名报FileNotFoundError问题
问题现象
编写Python脚本遍历多级子目录,实现两个功能:
- 对所有
.ext后缀的文件,在指定行插入固定文本内容 - 将处理完成的文件后缀从
.ext修改为.ext2
脚本在主目录下仅存在单个子目录时运行正常,存在多个子目录时在文件读取行抛出FileNotFoundError: [Errno 2] No such file or directory错误,提示找不到对应名称的文件。
目标目录结构参考:
原始错误代码如下:
import os directory = 'C:\\Users\\folder\\subfolders' for dir, subdirs, files in os.walk(directory): for name in files: if name.endswith((".ext")): with open(name, "r") as f: XMLContent = f.readlines() XMLContent.insert(6, '<XMLFormat>\n') XMLContent.insert(40, '\n</XMLFormat>') with open(name, "w") as f: XMLContent = "".join(XMLContent) f.write(XMLContent) os.rename(os.path.join(dir, name), os.path.join(dir, name[:name.index('.ext')] +".ext1"))
错误原因
os.walk()遍历返回的name是不含上级路径的纯文件名,直接用open(name)打开文件时,Python会默认在脚本的运行工作目录下查找该文件。
单级子目录场景下运行正常属于巧合:脚本工作目录刚好和文件所在目录重合;多子目录遍历时,其他子目录下的文件不在工作目录路径下,直接用纯文件名打开必然找不到文件。
除此之外原始代码还有两个逻辑问题:
- 重命名时写死的后缀是
.ext1,和需求要求的.ext2不符 - 用
name.index('.ext')截断文件名,如果文件名本身包含.ext字符串(比如a.ext.test.ext)会出现截断错误
修复后代码
import os directory = r'C:\Users\folder\subfolders' for root, _, files in os.walk(directory): for filename in files: if filename.endswith(".ext"): # 拼接文件完整路径,解决找不到文件的问题 file_full_path = os.path.join(root, filename) # 读取原文件内容 with open(file_full_path, "r", encoding="utf-8") as f: file_content = f.readlines() # 插入指定文本 file_content.insert(6, '<XMLFormat>\n') file_content.insert(40, '\n</XMLFormat>') # 将修改后的内容写回文件 with open(file_full_path, "w", encoding="utf-8") as f: f.write("".join(file_content)) # 生成新后缀的文件路径,用splitext安全处理文件名 new_file_path = os.path.join(root, f"{os.path.splitext(filename)[0]}.ext2") os.rename(file_full_path, new_file_path)
修复说明
- 所有文件操作都通过
os.path.join(root, filename)拼接得到文件的完整路径,从根源解决多目录遍历找不到文件的问题 - 用
os.path.splitext()安全拆分文件名和后缀,避免文件名包含目标后缀字符串时的截断错误 - 修正重命名后缀为需求要求的
.ext2 - 文件读写显式指定
encoding="utf-8",避免不同操作系统默认编码不一致导致的乱码问题 - 替换了和Python内置函数重名的
dir变量名为root,避免潜在的变量名冲突
内容的提问来源于stack exchange,提问作者7chour
相关产品推荐
相关产品推荐

