You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历子目录修改文件及扩展名报FileNotFoundError问题

问题现象

编写Python脚本遍历多级子目录,实现两个功能:

  1. 对所有.ext后缀的文件,在指定行插入固定文本内容
  2. 将处理完成的文件后缀从.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 03:01:17